it-swarm.it

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

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


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

160
Jakub Šturc

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/elemento 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
205
JRoppert

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 crea un assieme, sia AssemblyInfo.cs che CommonAssemblyInfo.cs sono integrati 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 possa aiutare.

19
Krishna

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 informazioni sull'assemblaggio per soluzione, supponendo che una soluzione sia una singola linea di prodotti/prodotto rilasciabile. Il file comune di informazioni sull'Assemblea ha anche:

[Assembly: AssemblyInformationalVersion("0.9.2.0")]

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

13
Scott Dorman

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.

8
jlew

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 di solito così rare e semplici da gestire non credo DRY dovrebbe essere una considerazione. Basta eseguire il seguente script MSBuild (a seconda del MSBuild Extension Pack ) 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>
5
Schneider

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 . Add As Link
(fonte: free.fr )

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

3

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

Uso TortoiseSvn ed è facile usare il suo SubWCRev.exe per trasformare un modello AssemblyInfo.wcrev in 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 OK).

A proposito, aggiungi AssemblyInfo.wcrev al tuo controllo versione e ignoraAssemblyInfo.cs se lo usi.

1
John Denniston

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 assieme. Le due informazioni più ovvie sono AssemblyTitle e AssemblyVersion.

Una soluzione migliore potrebbe essere quella di utilizzare il file targets, gestito da MSBuild, al fine di "iniettare" gli attributi Assembly in più di un progetto.

1
SaguiItay