Apa praktik terbaik untuk menggunakan Atribut Majelis?

163

Saya punya solusi dengan banyak proyek. Saya mencoba mengoptimalkan file AssemblyInfo.cs dengan menautkan satu solusi file info perakitan lebar. Apa praktik terbaik untuk melakukan ini? Atribut mana yang harus dalam file solusi lebar dan mana yang spesifik untuk proyek / perakitan?


Sunting: Jika Anda tertarik ada pertanyaan lanjutan Apa perbedaan antara AssemblyVersion, AssemblyFileVersion, dan AssemblyInformationalVersion?

Jakub Šturc
sumber

Jawaban:

207

Kami menggunakan file global yang disebut GlobalAssemblyInfo.cs dan yang lokal bernama AssemblyInfo.cs. File global berisi atribut berikut:

 [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")]

AssemblyInfo.cs lokal berisi atribut berikut:

 [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")]

Anda dapat menambahkan GlobalAssemblyInfo.cs menggunakan prosedur berikut:

  • Pilih Tambah / Item Yang Ada ... di menu konteks proyek
  • Pilih GlobalAssemblyInfo.cs
  • Luaskan Tombol Tambah dengan mengklik panah bawah kecil di sebelah kanan
  • Pilih "Tambah Sebagai Tautan" di daftar drop-down tombol
JRoppert
sumber
apa tujuan menjaga file AssemblyInfo.cs lama? Ketika saya mengotomatiskan cap versi build saya di GlobalAssemblyInfo.cs, bagaimana cara memperbarui file AssemblyInfo.cs yang saya miliki dalam solusi saya?
D3vtr0n
3
@Devtron File AssemblyInfo individual harus memberikan informasi unik untuk majelis yang mereka tinggali (misalnya judul, deskripsi, dan budaya, seperti pada contoh di atas). Entri umum, seperti nama produk dan informasi pembuatan versi harus dihapus (dan akan menyebabkan kesalahan penyusun jika digandakan). Idealnya, file AssemblyInfo tidak akan diperbarui oleh proses pembuatan.
David Keaveny
1
The AssemblyCultureAttributelayak penjelasan yang lebih baik. Atribut sebaiknya tidak ada sama sekali (kecuali ini adalah perakitan satelit). Saat menggunakan rakitan satelit dalam skala besar, seseorang mungkin memerlukan tiga, bukan dua tingkat file info rakitan (global, rakitan utama, dan rakitan satelit yang hanya menentukan budaya dalam kasus ini).
Jirka Hanika
20

Dalam kasus saya, kami sedang membangun produk yang kami punya solusi Visual Studio, dengan berbagai komponen dalam proyek mereka sendiri. Atribut umum pergi. Dalam solusinya, ada sekitar 35 proyek, dan info perakitan umum (CommonAssemblyInfo.cs), yang memiliki atribut berikut:

[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")]

Atribut lain seperti AssemblyTitle, AssemblyVersion dll, kami berikan berdasarkan per-perakitan. Saat membangun sebuah majelis, baik AssemblyInfo.cs dan CommonAssemblyInfo.cs dibangun di setiap unit. Ini memberi kami yang terbaik dari kedua dunia di mana Anda mungkin ingin memiliki beberapa atribut umum untuk semua proyek dan nilai-nilai spesifik untuk beberapa yang lain.

Semoga itu bisa membantu.

Krishna
sumber
apakah Anda memiliki 35+ entri dalam konfigurasi build Anda untuk menangani ini? Tampaknya agak berlebihan. Bagaimana jika Anda menambahkan 2 atau 3 proyek baru, apakah itu merusak bangunan Anda sampai Anda menambahkannya ke tugas Versi?
D3vtr0n
1
@ D3vtr0n, mengapa "membangun konfigurasi" (apa maksud Anda dengan itu) membutuhkan begitu banyak entri? Saya berasumsi file ini termasuk dalam setiap .csproj melalui <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, direktif MSBuild yang bahkan mungkin dalam Common.targetsfile bersama . Kode Yay digunakan kembali.
binki
15

Solusi yang disajikan oleh @JRoppert hampir sama dengan apa yang saya lakukan. Satu-satunya perbedaan adalah bahwa saya meletakkan baris berikut ini di file AssemblyInfo.cs lokal karena mereka dapat bervariasi dengan setiap perakitan:

#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)]

Saya juga (umumnya) menggunakan satu info perakitan umum per solusi, dengan asumsi bahwa satu solusi adalah satu lini produk / produk yang dapat dirilis. File info rakitan umum juga memiliki:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Yang akan mengatur nilai "ProductVersion" yang ditampilkan oleh Windows Explorer.

Scott Dorman
sumber
8

Tugas Komunitas MSBuild berisi tugas kustom yang disebut AssemblyInfo yang dapat Anda gunakan untuk membuat assemblyinfo.cs Anda. Ini membutuhkan sedikit pengeditan tangan untuk menggunakan file csproj Anda, tetapi bermanfaat.

baru saja
sumber
6

Menurut pendapat saya menggunakan GlobalAssemblyInfo.cs lebih banyak masalah daripada nilainya, karena Anda perlu memodifikasi setiap file proyek dan ingat untuk memodifikasi setiap proyek baru, sedangkan Anda mendapatkan AssemblyInfo.cs secara default.

Untuk perubahan nilai global (mis. Perusahaan, Produk, dll) perubahan biasanya sangat jarang dan mudah dikelola. Saya tidak berpikir KERING harus menjadi pertimbangan. Jalankan skrip MSBuild berikut (tergantung pada MSBuild Extension Pack ) ketika Anda ingin mengubah nilai secara manual di semua proyek sebagai satu kali:

<?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>
Jack Ukleja
sumber
3

Untuk berbagi file di antara banyak proyek, Anda dapat menambahkan file yang ada sebagai tautan.

Untuk melakukan ini, tambahkan file yang ada, dan klik "Tambahkan sebagai Tautan" di pemilih file. (sumber: free.fr )Tambahkan Sebagai Tautan

Adapun apa yang harus dimasukkan dalam file bersama, saya sarankan meletakkan hal-hal yang akan dibagikan di seluruh majelis. Hal-hal seperti hak cipta, perusahaan, mungkin versi.

Cameron MacFarland
sumber
1

Tidak disarankan menggunakan file AseemblyInfo.cs tunggal untuk banyak proyek. File AssemblyInfo termasuk informasi yang mungkin relevan hanya untuk perakitan tertentu. Dua informasi yang paling jelas adalah AssemblyTitledan AssemblyVersion.

Solusi yang lebih baik mungkin menggunakan targetsfile, yang ditangani oleh MSBuild, untuk "menyuntikkan" atribut perakitan ke lebih dari satu proyek.

SaguiItay
sumber
bagaimana jika Anda memiliki 20+ proyek? Itu mengharuskan saya untuk mempertahankan 20+ entri dalam konfigurasi build saya, hanya untuk versi. Sepertinya sangat timpang. Bagaimana jika saya menambah 2 atau 3 proyek baru? Itu pasti akan mematahkan proses pembangunan ... Adakah ide bagaimana mengatasinya?
D3vtr0n
@ D3vtr0n Saya pikir idenya adalah untuk menghasilkan Majelis yang relevan secara dinamis dan tidak memelihara konfigurasi individu untuk setiap proyek. Tugas Komunitas, saya pikir, menangani kasus itu.
Roman
1

Satu hal yang menurut saya berguna adalah untuk menghasilkan elemen AssemblyVersion (dll) dengan menerapkan token-subtitusi pada fase pra-bangun.

Saya menggunakan TortoiseSvn, dan mudah digunakan SubWCRev.exeuntuk mengubah templat AssemblyInfo.wcrevmenjadi AssemblyInfo.cs. Baris yang relevan dalam template mungkin terlihat seperti ini:

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

Elemen ketiga adalah nomor revisi. Saya menggunakan elemen keempat untuk memeriksa saya tidak lupa untuk melakukan file baru atau diubah (elemen keempat adalah 00 jika semuanya OK).

Omong-omong, tambahkan AssemblyInfo.wcrevke kontrol versi Anda dan abaikan AssemblyInfo.cs jika Anda menggunakan ini.

John Denniston
sumber