Montaj Özelliklerini kullanmak için en iyi uygulamalar nelerdir?


163

Birden fazla projeyle bir çözümüm var. Bir çözüm geniş montaj bilgi dosyasını bağlayarak AssemblyInfo.cs dosyalarını optimize etmeye çalışıyorum. Bunu yapmak için en iyi uygulamalar nelerdir? Hangi öznitelikler geniş çözüm dosyasında bulunmalı ve hangileri projeye / montaja özgüdür?


Düzenleme: Eğer ilgileniyorsanız bir takip soru var AssemblyVersion, AssemblyFileVersion ve AssemblyInformationalVersion arasındaki farklar nelerdir?

Yanıtlar:


207

GlobalAssemblyInfo.cs adlı global bir dosya ve AssemblyInfo.cs adlı yerel bir dosya kullanıyoruz. Genel dosya aşağıdaki öznitelikleri içerir:

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

Yerel AssemblyInfo.cs aşağıdaki öznitelikleri içerir:

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

Aşağıdaki yordamı kullanarak GlobalAssemblyInfo.cs dosyasını ekleyebilirsiniz:

  • Seç Ekle / Varolan madde ... proje bağlam menüsünde
  • GlobalAssemblyInfo.cs dosyasını seçin
  • Sağ taraftaki o küçük aşağı oku tıklayarak Ekle Düğmesini genişletin
  • Düğmeler açılır listesinden "Bağlantı Olarak Ekle" yi seçin

eski AssemblyInfo.cs dosya (lar) ını saklamanın amacı nedir? GlobalAssemblyInfo.cs içinde yapı sürüm damgamı otomatikleştirdiğimde, çözümümde bulunan AssemblyInfo.cs dosya (lar) ını nasıl güncelleştiririm?
D3vtr0n

3
@Devtron Bireysel AssemblyInfo dosyaları, içinde bulundukları derleme için benzersiz bilgiler sağlamalıdır (örneğin, yukarıdaki örnekte olduğu gibi başlık, açıklama ve kültür). Ürün adı ve sürüm bilgileri gibi yaygın girdiler kaldırılmalıdır (ve çoğaltılırsa derleyici hatasına neden olurlar). İdeal olarak, AssemblyInfo dosyaları oluşturma işlemi tarafından güncelleştirilmez.
David Keaveny

1
Daha AssemblyCultureAttributeiyi bir açıklamayı hak ediyor. Özellik en iyi şekilde bulunmamalıdır (bu bir uydu montajı değilse). Uydu montajlarını büyük ölçekte kullanırken, iki montaj bilgi dosyası seviyesine değil üç seviyeye ihtiyaç duyulabilir (global, ana montaj ve sadece bu durumda kültürü belirten uydu montajı).
Jirka Hanika

20

Benim durumumda, kendi projelerinde çeşitli bileşenleri olan bir Visual Studio çözümüne sahip olduğumuz bir ürün inşa ediyoruz. Ortak özellikler devam ediyor. Çözümde, yaklaşık 35 proje ve aşağıdaki özniteliklere sahip ortak bir montaj bilgisi (CommonAssemblyInfo.cs) vardır:

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

AssemblyTitle, AssemblyVersion vb. Gibi diğer özellikler, her bir montaj için ayrı ayrı tedarik ederiz. Bir derleme oluştururken her bir derleme içinde AssemblyInfo.cs ve CommonAssemblyInfo.cs yerleşiktir. Bu, bize tüm projeler için bazı ortak özelliklere ve bazıları için belirli değerlere sahip olmak isteyebileceğiniz iki dünyanın da en iyisini verir.

Umarım yardımcı olur.


bunu yapmak için yapı yapılandırmanızda 35'ten fazla giriş var mı? Oldukça gereksiz görünüyor. 2 veya 3 yeni proje eklerseniz, sürüm oluşturma görevine eklenene kadar derlemeniz bozulur mu?
11:20

1
@ D3vtr0n, neden bir "yapı yapılandırması" (bununla kastediyorsunuz) bu kadar çok girişe ihtiyaç duysun ki? Bu dosyanın her bir .csproj aracılığıyla <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, paylaşılan bir Common.targetsdosyada bile olabilecek bir MSBuild yönergesine dahil olduğunu varsayalım . Yay kodunun yeniden kullanımı.
binki

15

@JRoppert tarafından sunulan çözüm neredeyse yaptığımla aynı. Tek fark, her derlemede değişiklik gösterebileceğinden, yerel AssemblyInfo.cs dosyasına aşağıdaki satırları koymamdır:

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

Ayrıca (genellikle) bir çözümün tek bir ürün hattı / serbest bırakılabilir ürün olduğu varsayımıyla, çözüm başına bir ortak montaj bilgisi kullanıyorum. Ortak montaj bilgi dosyasında ayrıca:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Windows Gezgini tarafından görüntülenen "ProductVersion" değeri ayarlanır.


8

MSBuild Topluluk Görevleri , Assemblyinfo.cs dosyanızı oluşturmak için kullanabileceğiniz AssemblyInfo adlı özel bir görev içerir. Kullanmak için csproj dosyalarınızın biraz el ile düzenlenmesi gerekir, ancak faydalıdır.


6

Bence bir GlobalAssemblyInfo.cs kullanmak değerinden daha fazla sorun, çünkü her proje dosyasını değiştirmeniz ve her yeni projeyi değiştirmeyi unutmayın, oysa varsayılan olarak bir AssemblyInfo.cs alırsınız.

Global değerlerde (örn. Şirket, Ürün vb.) Yapılan değişiklikler için değişiklikler genellikle çok seyrek ve yönetilmesi kolaydır. DRY'nin dikkate alınması gerektiğini düşünmüyorum . Tüm projelerin değerlerini tek seferlik olarak manuel olarak değiştirmek istediğinizde , aşağıdaki MSBuild komut dosyasını ( MSBuild Extension Pack'e bağlı olarak ) çalıştırı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

Bir dosyayı birden çok proje arasında paylaşmak için mevcut bir dosyayı bağlantı olarak ekleyebilirsiniz.

Bunu yapmak için mevcut bir dosyayı ekleyin ve dosya seçicide "Bağlantı Olarak Ekle" yi tıklayın. (kaynak: free.fr )Bağlantı Olarak Ekle

Paylaşılan dosyaya ne yazacağım konusunda, derlemeler arasında paylaşılacak şeyleri koymanızı öneririm. Telif hakkı, şirket, belki de sürüm gibi şeyler.


1

Birden çok proje için tek bir AseemblyInfo.cs dosyası kullanılması önerilmez. AssemblyInfo dosyası, yalnızca söz konusu montajla ilgili olabilecek bilgiler içerir. En belirgin iki bilgi AssemblyTitleve AssemblyVersion.

targetsMontaj özniteliklerini birden fazla projeye "enjekte etmek" için MSBuild tarafından işlenen dosyayı kullanmak daha iyi bir çözüm olabilir .


20'den fazla projeniz varsa ne olacak? Bu, yalnızca Yapılandırma için derleme yapılandırmamda 20'den fazla girişi korumamı gerektirir. Gerçekten topal görünüyor. 2 veya 3 yeni proje eklersem ne olur? Bu kesinlikle inşa sürecini kıracak ... Bunu nasıl çözeceğine dair bir fikrin var mı?
D3vtr0n

@ D3vtr0n Bence fikir, ilgili Meclis'i dinamik olarak oluşturmak ve her proje için ayrı konfigürasyonları korumak değil. Topluluk Görevleri, bence, bu davayı ele alıyor.
Roma

1

Yararlı bulduğum bir şey, derleme öncesi aşamasında token ikamesi uygulayarak AssemblyVersion öğelerini (vb.) Oluşturmaktır.

TortoiseSvn kullanıyorum ve SubWCRev.exebir şablonu AssemblyInfo.wcrevdönüştürmek için kullanımı kolaydır AssemblyInfo.cs. Şablondaki ilgili satır şöyle görünebilir:

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

Üçüncü eleman revizyon numarasıdır. Yeni veya değiştirilmiş dosyaları işlemeyi unuttuğumu kontrol etmek için dördüncü öğeyi kullanıyorum (dördüncü öğe tamam ise 00'dır).

Bu arada, AssemblyInfo.wcrevsürüm denetiminize ekleyin ve bunu kullanırsanız yoksayın AssemblyInfo.cs .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.