Các thực hành tốt nhất để sử dụng các thuộc tính hội là gì?


163

Tôi có một giải pháp với nhiều dự án. Tôi đang cố gắng tối ưu hóa các tệp hội nghịInfo.cs bằng cách liên kết một tệp thông tin lắp ráp rộng. Các thực hành tốt nhất để làm điều này là gì? Những thuộc tính nào phải có trong tệp rộng giải pháp và thuộc tính cụ thể của dự án / lắp ráp?


Chỉnh sửa: Nếu bạn quan tâm, có một câu hỏi tiếp theo Sự khác biệt giữa Hội đồngVersion, Hội đồng hội thảo và Hội nghị Thông tin là gì?

Câu trả lời:


207

Chúng tôi đang sử dụng một tệp toàn cầu có tên GlobalAss lanhInfo.cs và một tệp cục bộ có tên là AssociationInfo.cs. Tệp toàn cầu chứa các thuộc tính sau:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

Hội nghịInInfo.cs cục bộ chứa các thuộc tính sau:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Bạn có thể thêm GlobalAssuggingInfo.cs bằng quy trình sau:

  • Chọn Thêm / Mục hiện có ... trong menu ngữ cảnh của dự án
  • Chọn GlobalAssuggingInfo.cs
  • Mở rộng Nút bổ sung bằng cách nhấp vào mũi tên xuống nhỏ đó ở bên tay phải
  • Chọn "Thêm dưới dạng liên kết" trong danh sách thả xuống các nút

mục đích của việc giữ (các) tập tin hội đồng cũ là gì? Khi tôi tự động hóa tem phiên bản xây dựng của mình trong GlobalAss lanhInfo.cs, làm thế nào để cập nhật (các) tệp hội nghịInfo.cs mà tôi có trong giải pháp của mình?
D3vtr0n

3
@Devtron Các tệp BangInfo riêng lẻ phải cung cấp thông tin duy nhất cho hội đồng mà chúng cư trú (ví dụ: tiêu đề, mô tả và văn hóa, như trong ví dụ trên). Các mục phổ biến, chẳng hạn như tên sản phẩm và thông tin phiên bản nên được loại bỏ (và sẽ gây ra lỗi trình biên dịch nếu chúng bị trùng lặp). Lý tưởng nhất là các tệp lắp ráp sẽ không được cập nhật bởi quá trình xây dựng.
David Keaveny

1
Các AssemblyCultureAttributegiải thích xứng đáng hơn. Thuộc tính tốt nhất nên vắng mặt hoàn toàn (trừ khi đây là lắp ráp vệ tinh). Khi sử dụng các cụm satelite trên quy mô lớn, người ta có thể cần ba, chứ không phải hai cấp tệp thông tin lắp ráp (toàn cầu, lắp ráp chính và lắp ráp vệ tinh chỉ xác định văn hóa trong trường hợp này).
Jirka Hanika

20

Trong trường hợp của tôi, chúng tôi đang xây dựng một sản phẩm mà chúng tôi có giải pháp Visual Studio, với các thành phần khác nhau trong các dự án của riêng họ. Các thuộc tính phổ biến đi. Trong giải pháp, có khoảng 35 dự án và một thông tin lắp ráp chung (CommonAssuggingInfo.cs), có các thuộc tính sau:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Các thuộc tính khác như Hội đồng chủ đề, Hội đồng, v.v., chúng tôi cung cấp trên cơ sở mỗi lần lắp ráp. Khi xây dựng một hội đồng, cả hội đồngInfo.cs và CommonAssuggingInfo.cs được tích hợp vào mỗi hội đồng. Điều này mang lại cho chúng tôi những điều tốt nhất của cả hai thế giới nơi bạn có thể muốn có một số thuộc tính chung cho tất cả các dự án và giá trị cụ thể cho một số dự án khác.

Mong rằng sẽ giúp.


Bạn có hơn 35 mục trong cấu hình bản dựng để xử lý việc này không? Có vẻ khá dư thừa. Điều gì sẽ xảy ra nếu bạn thêm 2 hoặc 3 dự án mới, điều đó có phá vỡ bản dựng của bạn cho đến khi bạn thêm chúng vào tác vụ Phiên bản không?
D3vtr0n

1
@ D3vtr0n, tại sao một cấu hình xây dựng trên máy tính (có nghĩa là gì) có thể cần nhiều mục như vậy? Tôi giả sử tệp này được bao gồm trong mỗi .csproj thông qua <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, một lệnh MSBuild thậm chí có thể nằm trong một Common.targetstệp được chia sẻ . Tái sử dụng mã Yay.
binki

15

Giải pháp được trình bày bởi @JRoppert gần giống như những gì tôi làm. Sự khác biệt duy nhất là tôi đặt các dòng sau vào tệp Hội nghị cục bộ vì chúng có thể thay đổi theo từng cụm:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

Tôi cũng (nói chung) sử dụng một thông tin lắp ráp chung cho mỗi giải pháp, với giả định rằng một giải pháp là một dòng sản phẩm / sản phẩm đáng tin cậy. Tệp thông tin lắp ráp phổ biến cũng có:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Cái nào sẽ đặt giá trị "ProductVersion" được hiển thị bởi Windows Explorer.


8

Nhiệm vụ cộng đồng MSBuild chứa một tác vụ tùy chỉnh có tên là AssociationInfo mà bạn có thể sử dụng để tạo assemblyinfo.cs. Nó đòi hỏi một chút chỉnh sửa bằng tay các tệp csproj của bạn để sử dụng, nhưng đáng giá.


6

Theo ý kiến ​​của tôi, việc sử dụng GlobalAssuggingInfo.cs sẽ rắc rối hơn giá trị của nó, bởi vì bạn cần sửa đổi mọi tệp dự án và nhớ sửa đổi mọi dự án mới, trong khi bạn mặc định nhận được một AssociationInfo.cs.

Đối với các thay đổi đối với các giá trị toàn cầu (ví dụ: Công ty, Sản phẩm, v.v.), các thay đổi thường không thường xuyên và đơn giản để quản lý Tôi không nghĩ DRY nên được xem xét. Chỉ cần chạy tập lệnh MSBuild sau (phụ thuộc vào Gói mở rộng MSBuild ) khi bạn muốn thay đổi thủ công các giá trị trong tất cả các dự án dưới dạng một lần:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

3

Để chia sẻ một tệp giữa nhiều dự án, bạn có thể thêm một tệp hiện có dưới dạng một liên kết.

Để thực hiện việc này, hãy thêm một tệp hiện có và nhấp vào "Thêm dưới dạng liên kết" trong bộ chọn tệp. (nguồn: free.fr )Thêm dưới dạng liên kết

Đối với những gì để đưa vào tệp chia sẻ, tôi sẽ đề nghị đặt những thứ sẽ được chia sẻ trên các hội đồng. Những thứ như bản quyền, công ty, có lẽ phiên bản.


1

Không nên sử dụng một tệp AseinstallInfo.cs cho nhiều dự án. Tệp AssociationInfo bao gồm thông tin có thể chỉ liên quan đến hội đồng cụ thể đó. Hai mẩu thông tin rõ ràng nhất là AssemblyTitleAssemblyVersion.

Một giải pháp tốt hơn có thể là sử dụng targetstệp, được xử lý bởi MSBuild, để "tiêm" các thuộc tính lắp ráp vào nhiều dự án.


Nếu bạn có hơn 20 dự án thì sao? Điều đó đòi hỏi tôi phải duy trì hơn 20 mục trong cấu hình bản dựng của mình, chỉ dành cho Phiên bản. Điều đó dường như thực sự khập khiễng. Nếu tôi thêm 2 hoặc 3 dự án mới thì sao? Điều đó chắc chắn sẽ phá vỡ quá trình xây dựng ... Bất kỳ ý tưởng làm thế nào để giải quyết điều đó?
D3vtr0n

@ D3vtr0n Tôi nghĩ rằng ý tưởng là tạo ra hội có liên quan một cách linh hoạt và không duy trì các cấu hình riêng lẻ cho mỗi dự án. Nhiệm vụ cộng đồng, tôi nghĩ, xử lý trường hợp đó.
La Mã

1

Một điều tôi thấy hữu ích là tạo các phần tử hội nghị (vv) bằng cách áp dụng thay thế mã thông báo trong giai đoạn tiền xây dựng.

Tôi sử dụng TortoiseSvn và thật dễ dàng để sử dụng nó SubWCRev.exeđể biến một mẫu AssemblyInfo.wcrevthành AssemblyInfo.cs. Dòng có liên quan trong mẫu có thể trông giống như thế này:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

Yếu tố thứ ba sau đó là số sửa đổi. Tôi sử dụng phần tử thứ tư để kiểm tra Tôi không quên cam kết bất kỳ tệp mới hoặc thay đổi nào (phần tử thứ tư là 00 nếu tất cả đều ổn).

Nhân tiện, thêm AssemblyInfo.wcrevvào kiểm soát phiên bản của bạn và bỏ qua AssemblyInfo.cs nếu bạn sử dụng điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.