Mettre à jour automatiquement le numéro de version

108

Je voudrais que la propriété de version de mon application soit incrémentée pour chaque build, mais je ne suis pas sûr de savoir comment activer cette fonctionnalité dans Visual Studio (2005/2008). J'ai essayé de spécifier AssemblyVersion comme 1.0. * Mais cela ne me donne pas exactement ce que je veux.

J'utilise également un fichier de paramètres et lors des tentatives précédentes, lorsque la version de l'assembly a changé, mes paramètres ont été réinitialisés par défaut, car l'application recherchait le fichier de paramètres dans un autre répertoire.

Je voudrais pouvoir afficher un numéro de version sous la forme de 1.1.38. Ainsi, lorsqu'un utilisateur trouve un problème, je peux enregistrer la version qu'il utilise et lui dire de mettre à jour s'il a une ancienne version.

Une brève explication du fonctionnement du contrôle de version serait également appréciée. Quand le numéro de version et de révision est-il incrémenté?

Robert Höglund
la source
La question suivante présente une solution simple et pratique pour savoir comment injecter un numéro de build dans votre application en générant un fichier source dans un événement de build. stackoverflow.com/questions/4450231/…
Ashley Davis

Réponses:

96

Avec le truc "Built in", vous ne pouvez pas, car l'utilisation de 1.0. * Ou 1.0.0. * Remplacera les numéros de révision et de construction par une date / horodatage codée, ce qui est généralement aussi un bon moyen.

Pour plus d'informations, consultez l' éditeur de liens d'assembly documentation dans la balise / v.

Quant à l'incrémentation automatique des nombres, utilisez la tâche AssemblyInfo:

Tâche AssemblyInfo

Cela peut être configuré pour incrémenter automatiquement le numéro de build.

Il y a 2 Gotchas:

  1. Chacun des 4 nombres de la chaîne Version est limité à 65535. Il s'agit d'une limitation Windows et il est peu probable qu'il soit corrigé.
  2. L'utilisation avec avec Subversion nécessite une petite modification:

Récupérer le numéro de version est alors assez simple:

Version v = Assembly.GetExecutingAssembly().GetName().Version;
string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision);

Et, pour clarifier: en .net ou au moins en C #, la construction est en fait le TROISIÈME numéro, pas le quatrième comme certaines personnes (par exemple les développeurs Delphi habitués à Major.Minor.Release.Build) pourraient s'y attendre.

Dans .net, il s'agit de Major.Minor.Build.Revision.

Michael Stum
la source
3
Je viens de trouver ce complément de studio visuel qui fait quelque chose de similaire: autobuildversion.codeplex.com
jrsconfitto
6
Cela signifie-t-il que le 4 juin 2179, les numéros de version par défaut de Microsoft seront cassés? (le 65536e jour après 2000)
Lloyd Powell
1
@Jugglingnutcase - ce lien serait presque parfait s'il fonctionnait pour les versions actuelles de Visual Studio
Kraang Prime
2
@SanuelJackson haha! ouais ça le ferait. dommage que je ne suive pas mes commentaires de 2010, désolé! : P La marche du temps et des versions nous attriste tous.
jrsconfitto
@Michael Stum: Pourriez-vous mettre à jour le lien pour la tâche AssemblyInfo dans votre réponse s'il vous plaît? Pour moi, il ne se charge pas correctement.
Matt
22

VS.NET définit par défaut la version d'assembly sur 1.0. * Et utilise la logique suivante lors de l'incrémentation automatique: il définit la partie de construction sur le nombre de jours depuis le 1er janvier 2000 et définit la partie de révision sur le nombre de secondes depuis minuit, heure locale, divisée par deux. Voir cet article MSDN .

La version de l'assembly se trouve dans un fichier assemblyinfo.vb ou assemblyinfo.cs. À partir du fichier:

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' 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")> 
Solracnapode
la source
Merci d'avoir inclus la date initiale:January 1st, 2000
kiewic
11

J'ai trouvé que cela fonctionne bien pour afficher simplement la date de la dernière version en utilisant ce qui suit partout où une version du produit est nécessaire:

System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss")

Plutôt que d'essayer d'obtenir la version à partir de quelque chose comme ce qui suit:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false);
object attribute = null;

if (attributes.Length > 0)
{
    attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute;
}
user8128167
la source
6
Je pense que vous voulez dire ceci: aaaa.MM.JJ.HHmm pas aaaa.MM.JJ.HHMM.
JHubbard80
1
Il s'agit de la solution la plus simple pour avoir une sorte de numéro de version attaché au changement de fichier d'assemblage.
Alexei
6

Quel système de contrôle de source utilisez-vous?

Presque tous ont une forme de balise $ Id $ qui est développée lorsque le fichier est archivé.

J'utilise généralement une forme de piratage pour afficher cela comme numéro de version.

L'autre alternative est d'utiliser la date comme numéro de build: 080803-1448

engtech
la source
Pouvez-vous développer sur "Presque tous ont une forme de balise $ Id $ qui se développe lorsque le fichier est archivé". Plus précisément, connaissez-vous la subversiion?
Greg B
3

[Visual Studio 2017, .csproj propriétés ]

Pour mettre à jour automatiquement votre propriété PackageVersion / Version / AssemblyVersion (ou toute autre propriété), commencez par créer un nouveau Microsoft.Build.Utilities.Task classe qui obtiendra votre numéro de build actuel et renvoyer le numéro mis à jour (je recommande de créer un projet séparé uniquement pour cette classe).

Mettre à jour manuellement les numéros MAJOR.MINOR, mais laissez - MSBuild mettre à jour automatiquement le numéro de build (1.1. 1 , 1,1. 2 , 1.1. 3 , etc. :)

using Microsoft.Build.Framework;
using System;
using System.Collections.Generic;
using System.Text;

public class RefreshVersion : Microsoft.Build.Utilities.Task
{
    [Output]
    public string NewVersionString { get; set; }
    public string CurrentVersionString { get; set; } 

    public override bool Execute()
    {       
        Version currentVersion = new Version(CurrentVersionString ?? "1.0.0");

        DateTime d = DateTime.Now;
        NewVersionString = new Version(currentVersion.Major, 
            currentVersion.Minor, currentVersion.Build+1).ToString();
        return true;
    }

}

Appelez ensuite votre processus de tâche récemment créé sur MSBuild en ajoutant le code suivant sur votre fichier .csproj:

<Project Sdk="Microsoft.NET.Sdk">    
...
<UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" />
<Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
   <RefreshVersion CurrentVersionString="$(PackageVersion)">
          <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" />             
   </RefreshVersion>
   <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" />
   <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" />
</Target>
...
<PropertyGroup>
 ..
 <PackageVersion>1.1.4</PackageVersion>
 ..

Lors de la sélection de l'option de projet Visual Studio Pack (il suffit de changer BeforeTargets="Build"pour exécuter la tâche avant la génération) le code RefreshVersion sera déclenché pour calculer le nouveau numéro de version, etXmlPoke tâche mettra à jour votre propriété .csproj en conséquence (oui, cela modifiera le fichier).

Lorsque vous travaillez avec des bibliothèques NuGet, j'envoie également le package au référentiel NuGet en ajoutant simplement la tâche de construction suivante à l'exemple précédent.

<Message Text="Uploading package to NuGet..." Importance="high" />
<Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" />

c:\nuget\nugetest l'endroit où j'ai le client NuGet (n'oubliez pas d'enregistrer votre clé d'API NuGet en appelant nuget SetApiKey <my-api-key>ou d'inclure la clé dans l'appel push NuGet).

Juste au cas où cela aiderait quelqu'un ^ _ ^.

Nacho Coll
la source
1

Il y a quelque temps, j'ai écrit un exe rapide et sale qui mettrait à jour les numéros de version dans un assemblyinfo. {Cs / vb} - J'ai également utilisé rxfind.exe (un outil de remplacement de recherche simple et puissant basé sur les regex) pour faire le mise à jour à partir d'une ligne de commande dans le cadre du processus de construction. Quelques autres conseils utiles:

  1. séparez les informations d'assemblage en pièces de produit (nom de l'entreprise, version, etc.) et pièces spécifiques à l'assemblage (nom d'assemblage, etc.). Voir ici
  2. Aussi - j'utilise subversion, donc j'ai trouvé utile de définir le numéro de version sur le numéro de révision de subversion, ce qui rend vraiment facile de toujours revenir à la base de code qui a généré l'assemblage (par exemple, 1.4.100.1502 a été construit à partir de la révision 1502).
caryden
la source
S'il s'agit d'un fichier de code ( .cs / .vb), vous devez utiliser un modèle T4 à la place.
BrainSlugs83
0

Si vous voulez un nombre à incrémentation automatique qui se met à jour à chaque fois qu'une compilation est effectuée, vous pouvez utiliser VersionUpdater à partir d'un événement de pré-construction. Votre événement de pré-build peut vérifier la configuration de build si vous préférez afin que le numéro de version ne s'incrémente que pour une build Release (par exemple).

user283258
la source
Intéressant. J'ai eu le mien pendant des années avec le même nom et je ne savais pas qu'il en existait un (bien que je viens de le mettre en ligne récemment): github.com/rjamesnw/VersionUpdater
James Wilkins