383 votes

Puis-je incrémenter automatiquement la version de construction du fichier lorsque j'utilise Visual Studio ?

Je me demandais juste comment je pourrais automatiquement incrémenter le build (et la version ?) de mes fichiers en utilisant Visual Studio (2005).

Si je cherche les propriétés de disons C:\Windows\notepad.exe L'onglet Version donne "Version du fichier : 5.1.2600.2180". J'aimerais aussi avoir ces chiffres sympas dans la version de mes dll, et non la version 1.0.0.0, qui, avouons-le, est un peu terne.

J'ai essayé plusieurs choses, mais il ne semble pas s'agir d'une fonctionnalité prête à l'emploi, ou peut-être que je ne cherche pas au bon endroit (comme d'habitude).

Je travaille principalement sur des projets web....

J'ai regardé les deux :

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

et je n'arrivais pas à croire que tant d'efforts pour faire quelque chose soit une pratique courante.

EDIT : Il ne fonctionne pas dans VS2005 pour autant que je sache ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )

1 votes

Le caractère de remplacement ne semble fonctionner que pour AssemblyVersion, mais pas pour AssemblyFileVersion en VS 2005.

0 votes

Existe-t-il des solutions qui fonctionnent pour les projets C++ dans VS2005 ? Toutes les réponses semblent se rapporter à .Net. Question connexe . Merci

1 votes

En .Net Core projets AssemblyVersion l'auto-incrémentation ne fonctionne pas par défaut. Vous devez ajouter <Deterministic>False</Deterministic> à csproj. Voir Versionnement automatique dans Visual Studio 2017 (.NET Core)

448voto

Sam Meldrum Points 7405

Dans Visual Studio 2008, la procédure suivante fonctionne.

Trouvez le fichier AssemblyInfo.cs et trouvez ces 2 lignes :

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Vous pourriez essayer de changer cela en :

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

Mais cela ne vous donnera pas le résultat souhaité, vous vous retrouverez avec une version du produit de 1.0.* et une version de fichier de 1.0.0.0 . Pas ce que vous voulez !

Cependant, si vous supprimez la deuxième de ces lignes et que vous avez juste :

[assembly: AssemblyVersion("1.0.*")]

Le compilateur définira alors la version du fichier comme étant égale à la version du produit et vous obtiendrez le résultat souhaité, à savoir une version du produit et une version du fichier qui s'incrémentent automatiquement et qui sont synchronisées. Par exemple 1.0.3266.92689

2 votes

Cela fonctionne aussi bien que n'importe quoi d'autre, et fonctionne dans VS2005. J'espérais un nombre rationnel comme 1.0.1.56, mais j'ai obtenu 1.0.3266.30135, mais au moins il augmente (bien que par un nombre aléatoire :D).

14 votes

Oh je viens de le lire : il remplira automatiquement les deux derniers chiffres avec la date (en jours à partir d'un certain point) et l'heure (la moitié des secondes à partir de minuit).

22 votes

Bien vu de devoir supprimer l'attribut AssemblyFileVersion pour que cela fonctionne !

157voto

Hath Points 5505

Ouvrez le fichier AssemblyInfo.cs et modifiez

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

à

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

vous pouvez le faire dans l'IDE en allant dans projet -> propriétés -> informations sur l'assemblage

Cependant, cela ne vous permettra que d'auto-incrémenter la version de l'Assemblée et vous donnera l'adresse de l'Assemblée.

Version du fichier d'assemblage : Un caractère de remplacement ("*") n'est pas autorisé dans ce champ.

si vous essayez de placer un * dans le champ de la version du fichier.

Il suffit donc d'ouvrir le fichier assemblyinfo.cs et de le faire manuellement.

1 votes

Oui, je viens de rencontrer le ""Assembly File Version : Un caractère générique ("*") n'est pas autorisé dans ce champ". C'est ce qui a valu à votre méthode le feu vert :D

0 votes

@in.spite - c'est étrange, j'ai VS2005 pro et il semble fonctionner de la même manière que vs 2008.

3 votes

Cela fonctionne : [assembly : AssemblyVersion("1.0.*")] // [assembly : AssemblyFileVersion("1.0.0.0")]

55voto

Christian Points 3966

Une autre option pour changer les numéros de version dans chaque build est d'utiliser la commande Version tâche de Tâches de la communauté MSBuild . Il suffit de télécharger leur installateur, de l'installer, puis d'adapter le code suivant et de le coller après <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> dans votre .csproj fichier :

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

Nota: Adaptez la propriété StartDate à votre région. Il n'utilise pas actuellement la culture invariante.

Pour le troisième build du 14 janvier 2010, cela crée une VersionInfo.cs avec ce contenu :

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

Ce fichier doit ensuite être ajouté au projet (par l'intermédiaire de Ajouter un élément existant ), et le AssemblyVersion y AssemblyFileVersion Les lignes doivent être retirées de AssemblyInfo.cs .

Les différents algorithmes de modification des composants de la version sont décrits dans le document $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm y Propriétés de la version .

2 votes

C'est le meilleur moyen que j'ai vu jusqu'à présent pour contourner le fait que les structures FileVersion utilisent des entiers de 16 bits.

1 votes

J'ai rencontré des problèmes lors de l'installation dans VS2012 en utilisant la Package Console. Je recommande donc d'utiliser les installateurs msi nocturnes téléchargés à l'adresse suivante github.com/loresoft/msbuildtasks/downloads . Fonctionne en copier/coller à partir de ce qui précède. Merci !

0 votes

Après avoir été refusé et édité sur ce post : "Vous pouvez également vouloir vérifier ceci loresoft.com/projects/msbuildtasks/ il peut améliorer la fonctionnalité de base décrite précédemment."

30voto

Boog Points 1099

J'ai trouvé une solution similaire à celle de Christians mais sans dépendre des tâches communautaires MSBuild, ce qui n'est pas une option pour moi car je ne veux pas installer ces tâches pour tous nos développeurs.

Je suis en train de générer du code et de le compiler dans un assemblage et je souhaite que les numéros de version s'incrémentent automatiquement. Cependant, je ne peux pas utiliser l'astuce AssemblyVersion de VS 6.0.* car elle incrémente automatiquement les numéros de build chaque jour et rompt la compatibilité avec les assemblages qui utilisent un numéro de build plus ancien. Au lieu de cela, je veux avoir une AssemblyVersion codée en dur mais une AssemblyFileVersion s'incrémentant automatiquement. J'ai réalisé cela en spécifiant AssemblyVersion dans AssemblyInfo.cs et en générant un VersionInfo.cs dans MSBuild comme ceci,

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

Cela va générer un fichier VersionInfo.cs avec un attribut Assembly pour AssemblyFileVersion où la version suit le schéma de YY.MM.DD.TTTT avec la date de construction. Vous devez inclure ce fichier dans votre projet et construire avec lui.

0 votes

MSBuild supporte-t-il les variables ? Il serait préférable de mettre [System.DateTime]::Now en un seul, sinon, il y a une condition de course qui peut causer l'utilisation d'un ancien numéro de construction si la construction est proche de minuit.

0 votes

Avez-vous défini ces quatre propriétés au lieu de les combiner en une seule DateTime.ToString à des fins démonstratives, ou y a-t-il une raison particulière ?

0 votes

Si l'événement BeforeBuild ne se déclenche pas dans VS2017, consultez le site suivant stackoverflow.com/questions/43921992/

17voto

Installer le Incrément de version add-in. Il vous donne beaucoup plus de contrôle que l'option *.

0 votes

Seulement pour VS2005/2008, avec une bêta pour VS2010

0 votes

autobuildversion.codeplex.com/discussions/393154 Le lien DropBox vers la fin du fil de discussion, de r3mote203, est pour 2010 et fonctionne en 2012 (et peut-être 2013).

2 votes

J'utilise Versions automatiques pour VS2012, et cela fonctionne très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X