it-swarm-fr.com

Quelles sont les meilleures pratiques d'utilisation des attributs d'assemblage?

J'ai une solution avec plusieurs projets. J'essaie d'optimiser les fichiers AssemblyInfo.cs en liant un fichier d'informations d'assemblage à l'échelle de la solution. Quelles sont les meilleures pratiques pour ce faire? Quels attributs doivent figurer dans le fichier à l'échelle de la solution et lesquels sont spécifiques au projet/assemblage?


Edit: Si vous êtes intéressé, il y a une question de suivi Quelles sont les différences entre AssemblyVersion, AssemblyFileVersion et AssemblyInformationalVersion?

160
Jakub Šturc

Nous utilisons un fichier global appelé GlobalAssemblyInfo.cs et un fichier local appelé AssemblyInfo.cs. Le fichier global contient les attributs suivants:

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

Le AssemblyInfo.cs local contient les attributs suivants:

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

Vous pouvez ajouter le GlobalAssemblyInfo.cs à l'aide de la procédure suivante:

  • Sélectionnez Ajouter/Élément existant ... dans le menu contextuel du projet
  • Sélectionnez GlobalAssemblyInfo.cs
  • Développez le bouton Ajouter en cliquant sur cette petite flèche vers le bas sur la main droite
  • Sélectionnez "Ajouter comme lien" dans la liste déroulante des boutons
205
JRoppert

Dans mon cas, nous construisons un produit pour lequel nous avons une solution Visual Studio, avec divers composants dans leurs propres projets. Les attributs communs disparaissent. Dans la solution, il y a environ 35 projets et une info d'assemblage commune (CommonAssemblyInfo.cs), qui a les attributs suivants:

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

Les autres attributs tels que AssemblyTitle, AssemblyVersion, etc., sont fournis par assemblage. Lors de la construction d'un assembly, AssemblyInfo.cs et CommonAssemblyInfo.cs sont intégrés à chaque assembly. Cela nous donne le meilleur des deux mondes où vous voudrez peut-être avoir des attributs communs pour tous les projets et des valeurs spécifiques pour certains autres.

J'espère que ça t'as aidé.

19
Krishna

La solution présentée par @JRoppert est presque la même que ce que je fais. La seule différence est que je mets les lignes suivantes dans le fichier AssemblyInfo.cs local car elles peuvent varier avec chaque 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)]

J'utilise également (généralement) une seule information d'assemblage par solution, en supposant qu'une solution est une seule ligne de produit/produit libérable. Le fichier d'informations d'assemblage commun contient également:

[Assembly: AssemblyInformationalVersion("0.9.2.0")]

Ce qui définira la valeur "ProductVersion" affichée par l'Explorateur Windows.

13
Scott Dorman

MSBuild Community Tasks contient une tâche personnalisée appelée AssemblyInfo que vous pouvez utiliser pour générer votre assemblyinfo.cs. Cela nécessite une petite modification manuelle de vos fichiers csproj pour l'utiliser, mais cela en vaut la peine.

8
jlew

À mon avis, l'utilisation d'un GlobalAssemblyInfo.cs est plus problématique que cela en vaut la peine, car vous devez modifier chaque fichier de projet et n'oubliez pas de modifier chaque nouveau projet, tandis que vous obtenez un AssemblyInfo.cs par défaut.

Pour les modifications des valeurs globales (c.-à-d. Société, produit, etc.), les modifications sont généralement si peu fréquentes et simples à gérer, je ne pense pas que SEC devrait être pris en considération. Exécutez simplement le script MSBuild suivant (en fonction de MSBuild Extension Pack ) lorsque vous souhaitez modifier manuellement les valeurs de tous les projets de manière ponctuelle:

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

Pour partager un fichier entre plusieurs projets, vous pouvez ajouter un fichier existant en tant que lien.

Pour ce faire, ajoutez un fichier existant et cliquez sur "Ajouter comme lien" dans le sélecteur de fichiers . Add As Link
(source: free.fr )

Quant à ce qu'il faut mettre dans le fichier partagé, je suggérerais de mettre des choses qui seraient partagées entre les assemblys. Des choses comme le droit d'auteur, la société, peut-être la version.

3
Cameron MacFarland

Une chose que j'ai trouvée utile est de générer les éléments AssemblyVersion (etc.) en appliquant la substitution de jetons dans la phase de pré-construction.

J'utilise TortoiseSvn, et il est facile d'utiliser son SubWCRev.exe pour transformer un modèle AssemblyInfo.wcrev en AssemblyInfo.cs. La ligne appropriée dans le modèle pourrait ressembler à ceci:

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

Le troisième élément est alors le numéro de révision. J'utilise le quatrième élément pour vérifier que je n'ai pas oublié de valider des fichiers nouveaux ou modifiés (le quatrième élément est 00 si tout est OK).

Au fait, ajoutez AssemblyInfo.wcrev à votre contrôle de version et ignorerAssemblyInfo.cs si vous l'utilisez.

1
John Denniston

L'utilisation d'un seul fichier AseemblyInfo.cs pour plusieurs projets n'est pas recommandée. Le fichier AssemblyInfo contient des informations qui peuvent être pertinentes uniquement pour cet assembly spécifique. Les deux informations les plus évidentes sont les AssemblyTitle et AssemblyVersion.

Une meilleure solution pourrait être d'utiliser le fichier targets, qui est géré par MSBuild, afin d '"injecter" des attributs d'assembly dans plusieurs projets.

1
SaguiItay