Quali sono le migliori pratiche per l'utilizzo degli attributi di assieme?


163

Ho una soluzione con più progetti. Sto cercando di ottimizzare i file AssemblyInfo.cs collegando un file di informazioni sull'assieme a livello di soluzione. Quali sono le migliori pratiche per farlo? Quali attributi dovrebbero essere nel file di soluzione e quali sono specifici di progetto / assembly?


Modifica: se sei interessato c'è una domanda di follow-up Quali sono le differenze tra AssemblyVersion, AssemblyFileVersion e AssemblyInformationalVersion?

Risposte:


207

Stiamo usando un file globale chiamato GlobalAssemblyInfo.cs e uno locale chiamato AssemblyInfo.cs. Il file globale contiene i seguenti attributi:

 [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 locale contiene i seguenti attributi:

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

È possibile aggiungere GlobalAssemblyInfo.cs utilizzando la seguente procedura:

  • Seleziona Aggiungi / Articolo esistente ... nel menu contestuale del progetto
  • Seleziona GlobalAssemblyInfo.cs
  • Espandi il pulsante Aggiungi facendo clic su quella piccola freccia in giù sulla destra
  • Seleziona "Aggiungi come collegamento" nell'elenco a discesa dei pulsanti

qual è lo scopo di mantenere in giro i vecchi file AssemblyInfo.cs? Quando automatizzo il timbro della versione di build in GlobalAssemblyInfo.cs, come aggiorna i file AssemblyInfo.cs che ho nella mia soluzione?
D3vtr0n,

3
@Devtron I singoli file AssemblyInfo devono fornire informazioni univoche all'assembly in cui risiedono (ad es. Titolo, descrizione e cultura, come nell'esempio sopra). Le voci comuni, come il nome del prodotto e le informazioni sulla versione dovrebbero essere rimosse (e causeranno un errore del compilatore se sono duplicate). Idealmente, i file AssemblyInfo non verranno aggiornati dal processo di compilazione.
David Keaveny,

1
Il AssemblyCultureAttributemerita una spiegazione migliore. È meglio che l'attributo sia completamente assente (a meno che non si tratti di un assembly satellite). Quando si utilizzano assiemi satellitari su larga scala, potrebbero essere necessari tre, non due livelli di file di informazioni sull'assieme (globale, assieme principale e assieme satellite che specifica solo la cultura in questo caso).
Jirka Hanika,

20

Nel mio caso, stiamo costruendo un prodotto per il quale abbiamo una soluzione Visual Studio, con vari componenti nei loro progetti. Gli attributi comuni vanno. Nella soluzione, ci sono circa 35 progetti e informazioni sull'assembly comune (CommonAssemblyInfo.cs), che ha i seguenti attributi:

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

Gli altri attributi come AssemblyTitle, AssemblyVersion ecc. Vengono forniti in base al singolo assemblaggio. Quando si costruisce un assieme, sia AssemblyInfo.cs che CommonAssemblyInfo.cs sono incorporati in ciascun assieme. Questo ci dà il meglio di entrambi i mondi in cui potresti voler avere alcuni attributi comuni per tutti i progetti e valori specifici per alcuni altri.

Spero che aiuti.


hai 35+ voci nella tua configurazione di build per gestire questo? Sembra piuttosto ridondante. Che cosa succede se aggiungi 2 o 3 nuovi progetti, ciò interrompe la tua build fino a quando non li aggiungi all'attività Versioning?
D3vtr0n,

1
@ D3vtr0n, perché una "configurazione build" (cosa intendi con questo) avrebbe bisogno di così tante voci? Presumo che questo file sia incluso in ogni .csproj attraverso <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, una direttiva MSBuild che potrebbe anche essere in una condivisioneCommon.targets file . Riutilizzo del codice yay.
binki,

15

La soluzione presentata da @JRoppert è quasi la stessa di quello che faccio. L'unica differenza è che ho inserito le seguenti righe nel file AssemblyInfo.cs locale in quanto possono variare con ogni assembly:

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

Inoltre (generalmente) utilizzo una comune informazione di assemblaggio per soluzione, supponendo che una soluzione sia una singola linea di prodotti / prodotto rilasciabile. Il file comune di informazioni sull'assembly ha anche:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Che imposterà il valore "ProductVersion" visualizzato da Esplora risorse.


8

MSBuild Community Tasks contiene un'attività personalizzata denominata AssemblyInfo che è possibile utilizzare per generare assemblyinfo.cs. Richiede una piccola modifica manuale dei file csproj da usare, ma vale la pena.


6

A mio avviso, utilizzare un GlobalAssemblyInfo.cs è più un problema di quanto non valga la pena, perché è necessario modificare ogni file di progetto e ricordare di modificare ogni nuovo progetto, mentre per impostazione predefinita si ottiene un AssemblyInfo.cs.

Per le modifiche ai valori globali (ad es. Società, prodotto, ecc.) Le modifiche sono generalmente così rare e semplici da gestire, non credo che DRY debba essere preso in considerazione. Basta eseguire il seguente script MSBuild (a seconda del pacchetto di estensione MSBuild ) quando si desidera modificare manualmente i valori in tutti i progetti come una tantum:

<?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

Per condividere un file tra più progetti è possibile aggiungere un file esistente come collegamento.

Per fare ciò, aggiungi un file esistente e fai clic su "Aggiungi come collegamento" nel selettore di file. (fonte: free.fr )Aggiungi come collegamento

Per quanto riguarda cosa inserire nel file condiviso, suggerirei di inserire elementi da condividere tra gli assiemi. Cose come copyright, società, forse versione.


1

Si sconsiglia l'utilizzo di un singolo file AseemblyInfo.cs per più progetti. Il file AssemblyInfo include informazioni che potrebbero essere rilevanti solo per quel determinato assembly. Le due informazioni più ovvie sono la AssemblyTitleeAssemblyVersion .

Una soluzione migliore potrebbe essere quella di utilizzare i targetsfile, che sono gestiti da MSBuild, al fine di "iniettare" gli attributi di assembly in più di un progetto.


cosa succede se hai più di 20 progetti? Ciò richiede che io mantenga oltre 20 voci nella mia configurazione di build, solo per il controllo delle versioni. Sembra davvero zoppo. Cosa succede se aggiungo 2 o 3 nuovi progetti? Ciò interromperà sicuramente il processo di compilazione ... Qualche idea su come risolverlo?
D3vtr0n,

@ D3vtr0n Penso che l'idea sia quella di generare dinamicamente l'Assemblea rilevante e di non mantenere le singole configurazioni per ciascun progetto. Compiti della comunità, penso, gestisce quel caso.
Roman

1

Una cosa che ho trovato utile è generare gli elementi AssemblyVersion (ecc.) Applicando la sostituzione token nella fase di pre-build.

Uso TortoiseSvn ed è facile da usare SubWCRev.exeper trasformare un modello AssemblyInfo.wcrevin AssemblyInfo.cs. La riga pertinente nel modello potrebbe essere simile a questa:

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

Il terzo elemento è quindi il numero di revisione. Uso il quarto elemento per verificare di non aver dimenticato di eseguire il commit di file nuovi o modificati (il quarto elemento è 00 se è tutto a posto).

A proposito, aggiungi AssemblyInfo.wcreval controllo della versione e ignora AssemblyInfo.cs se lo usi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.