it-swarm-eu.dev

Was sind die Best Practices für die Verwendung von Baugruppenattributen?

Ich habe eine Lösung mit mehreren Projekten. Ich versuche, AssemblyInfo.cs-Dateien durch Verknüpfen einer lösungsweiten Assembly-Info-Datei zu optimieren. Was sind die Best Practices dafür? Welche Attribute sollten in einer lösungsweiten Datei enthalten sein und welche sind projekt-/montagespezifisch?


Bearbeiten: Bei Interesse gibt es eine Folgefrage Was sind die Unterschiede zwischen AssemblyVersion, AssemblyFileVersion und AssemblyInformationalVersion?

160
Jakub Šturc

Wir verwenden eine globale Datei mit dem Namen GlobalAssemblyInfo.cs und eine lokale Datei mit dem Namen AssemblyInfo.cs. Die globale Datei enthält die folgenden Attribute:

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

Die lokale AssemblyInfo.cs enthält die folgenden Attribute:

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

Sie können die Datei GlobalAssemblyInfo.cs wie folgt hinzufügen:

  • Wählen Sie im Kontextmenü des Projekts Add/Existing Item ...
  • Wählen Sie GlobalAssemblyInfo.cs aus
  • Erweitern Sie den Add-Button, indem Sie auf den kleinen Pfeil rechts klicken
  • Wählen Sie "Als Link hinzufügen" in der Dropdown-Liste der Schaltflächen
205
JRoppert

In meinem Fall erstellen wir ein Produkt, für das wir eine Visual Studio-Lösung mit verschiedenen Komponenten in eigenen Projekten haben. Die gemeinsamen Attribute gehen. In der Lösung befinden sich ca. 35 Projekte und eine allgemeine Assembly-Info (CommonAssemblyInfo.cs) mit den folgenden Attributen:

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

Die anderen Attribute wie AssemblyTitle, AssemblyVersion usw. liefern wir auf Assembly-Basis. Beim Erstellen einer Assembly werden sowohl AssemblyInfo.cs als auch CommonAssemblyInfo.cs in jede Assembly integriert. Dies gibt uns das Beste aus beiden Welten, in denen Sie einige gemeinsame Attribute für alle Projekte und bestimmte Werte für einige andere haben möchten.

Hoffentlich hilft das.

19
Krishna

Die von @JRoppert vorgestellte Lösung ist fast die gleiche wie meine. Der einzige Unterschied besteht darin, dass ich die folgenden Zeilen in die lokale AssemblyInfo.cs-Datei einfüge, da sie bei jeder Assembly unterschiedlich sein können:

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

Ich verwende (im Allgemeinen) auch eine allgemeine Baugruppeninfo pro Lösung, mit der Annahme, dass eine Lösung eine einzelne Produktlinie/ein einzelnes Produkt ist. Die gemeinsame Versammlungsinformationsdatei enthält außerdem:

[Assembly: AssemblyInformationalVersion("0.9.2.0")]

Damit wird der vom Windows Explorer angezeigte Wert für "ProductVersion" festgelegt.

13
Scott Dorman

MSBuild Community Tasks enthält eine benutzerdefinierte Task namens AssemblyInfo, mit der Sie assemblyinfo.cs generieren können. Es erfordert ein wenig manuelle Bearbeitung Ihrer csproj-Dateien, lohnt sich aber.

8
jlew

Meiner Meinung nach ist die Verwendung einer GlobalAssemblyInfo.cs schwieriger als es sich lohnt, da Sie jede Projektdatei ändern müssen und daran denken, jedes neue Projekt zu ändern, während Sie standardmäßig eine AssemblyInfo.cs erhalten.

Bei Änderungen an globalen Werten (z. B. Unternehmen, Produkt usw.) sind die Änderungen normalerweise so selten und einfach zu handhaben, dass ich nicht denke, dass [~ # ~] trocken [~ # ~] sollte eine Überlegung sein. Führen Sie einfach das folgende MSBuild-Skript aus (abhängig vom MSBuild Extension Pack ), wenn Sie die Werte in allen Projekten einmalig manuell ändern möchten:

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

Um eine Datei für mehrere Projekte freizugeben, können Sie eine vorhandene Datei als Link hinzufügen.

Fügen Sie dazu eine vorhandene Datei hinzu und klicken Sie in der Dateiauswahl auf "Als Link hinzufügen". Add As Link
(Quelle: free.fr )

Was in die gemeinsam genutzte Datei eingefügt werden soll, würde ich vorschlagen, Dinge zu platzieren, die von mehreren Assemblys gemeinsam genutzt werden. Dinge wie Copyright, Firma, vielleicht Version.

3

Eine Sache, die ich als nützlich empfunden habe, ist das Generieren der AssemblyVersion-Elemente (usw.) durch Anwenden der Tokensubstitution in der Vorerstellungsphase.

Ich benutze TortoiseSvn, und es ist einfach, seine SubWCRev.exe um eine Vorlage zu drehen AssemblyInfo.wcrev into AssemblyInfo.cs. Die entsprechende Zeile in der Vorlage könnte etwa so aussehen:

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

Das dritte Element ist dann die Revisionsnummer. Ich benutze das vierte Element, um zu überprüfen, ob ich vergessen habe, neue oder geänderte Dateien festzuschreiben (das vierte Element ist 00, wenn alles in Ordnung ist).

Übrigens AssemblyInfo.wcrev zu Ihrer Versionskontrolle und ignorierenAssemblyInfo.cs wenn du das benutzt.

1
John Denniston

Die Verwendung einer einzelnen AseemblyInfo.cs-Datei für mehrere Projekte wird nicht empfohlen. Die AssemblyInfo-Datei enthält Informationen, die möglicherweise nur für diese bestimmte Assembly relevant sind. Die zwei offensichtlichsten Informationen sind AssemblyTitle und AssemblyVersion.

Eine bessere Lösung könnte darin bestehen, targets -Datei zu verwenden, die von MSBuild verarbeitet wird, um Assembly-Attribute in mehr als ein Projekt "einzufügen".

1
SaguiItay