545 Stimmen

Wie erhält man eine automatisch inkrementierende Versionsnummer (Visual Studio)?

Ich möchte eine Reihe von Integer zu speichern, die automatisch bei der Build-Zeit inkrementiert werden:

int MajorVersion = 0;
int MinorVersion = 1;
int Revision = 92;

Wenn ich kompiliere, wird automatisch Folgendes inkrementiert Revision . Wenn ich das Setup-Projekt baue, würde es Folgendes inkrementieren MinorVersion (Ich habe kein Problem damit, dies manuell zu tun). MajorVersion würde nur manuell erhöht werden.

Dann könnte ich dem Benutzer im Menü Hilfe/Über eine Versionsnummer anzeigen:

  Version: 0.1.92

Wie kann dies erreicht werden?

Bei dieser Frage geht es nicht nur darum, wie man eine automatisch inkrementierende Versionsnummer erhält, sondern auch darum, wie man diese im Code verwendet.

702voto

Noel Kennedy Punkte 11838

Wenn Sie eine AssemblyInfo Klasse zu Ihrem Projekt und ändern Sie die AssemblyVersion Attribut mit einem Sternchen enden lassen, zum Beispiel:

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

Visual Studio erhöht die endgültige Zahl für Sie entsprechend der diese Regelungen (Danke Galets, ich hatte das völlig falsch verstanden!)

Um diese Version im Code zu referenzieren, so dass Sie sie dem Benutzer anzeigen können, verwenden Sie reflection . Zum Beispiel,

Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1)
                        .AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"{version} ({buildDate})";

Drei wichtige Fallstricke, die Sie kennen sollten

Von @ashes999:

Es ist auch erwähnenswert, dass, wenn beide AssemblyVersion y AssemblyFileVersion angegeben sind, werden Sie dies in Ihrer .exe nicht sehen.

Von @BrainSlugs83:

Nur die 4. Zahl wird als * kann schlecht sein, da die Version nicht immer inkrementiert wird. Die 3. Zahl ist die Anzahl der Tage seit dem Jahr 2000 et die 4. Zahl ist die Anzahl der Sekunden seit Mitternacht (geteilt durch 2) [ES IST KEIN RANDOM] . Wenn Sie die Lösung also an einem Tag spät und am nächsten Tag früh erstellt haben, hätte die spätere Version eine frühere Versionsnummer. Ich empfehle immer die Verwendung von X.Y.* anstelle von X.Y.Z.* weil sich Ihre Versionsnummer auf diese Weise IMMER erhöhen wird.

Bei neueren Versionen von Visual Studio tritt dieser Fehler auf:

(dieses Thema wurde 2009 begonnen)

Die angegebene Versionszeichenfolge enthält Platzhalter, die nicht mit dem Determinismus vereinbar sind. Entfernen Sie entweder Platzhalter aus der Versionszeichenfolge oder deaktivieren Sie den Determinismus für diese Kompilierung.

Siehe diese SO-Antwort, die erklärt, wie man Determinismus aufheben ( https://stackoverflow.com/a/58101474/1555612 )

191voto

Robert Lewis Punkte 527

Sie könnten die T4-Templating-Mechanismus in Visual Studio zur Generierung des erforderlichen Quellcodes aus einer einfachen Textdatei :

Ich wollte die Generierung von Versionsinformationen für einige .NET Projekte konfigurieren. Es ist lange her, dass ich mich mit den verfügbaren Optionen untersucht habe, also habe ich mich umgesehen und gehofft, eine einfache Möglichkeit zu finden dies zu tun. Was ich gefunden habe, sah nicht sehr ermutigend aus: Leute schreiben Visual Studio Add-Ins und benutzerdefinierte MsBuild-Aufgaben, nur um eine Integer-Zahl (okay, vielleicht zwei) zu erhalten. Das schien mir zu viel für ein kleines persönliches Projekt.

Die Anregung dazu kam aus einer der StackOverflow-Diskussionen, in der jemand vorschlug, dass T4-Vorlagen diese Aufgabe übernehmen könnten. Und natürlich können sie das. Die Lösung erfordert einen minimalen Aufwand und keine Anpassung von Visual Studio oder Anpassungen des Build-Prozesses. Hier ist, was getan werden sollte:

  1. Erstellen Sie eine Datei mit der Erweiterung ".tt" und platzieren Sie darin eine T4-Vorlage, die die Attribute AssemblyVersion und AssemblyFileVersion erzeugt:
<#@ template language="C#" #>
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>

Sie müssen sich für einen Algorithmus zur Erzeugung von Versionsnummern entscheiden. Für genügte es mir, automatisch eine Revisionsnummer zu generieren, die auf die der Anzahl der Tage seit dem 1. Januar 2010 entspricht. Wie Sie sehen können, ist die Versionsgenerierungsregel in einfachem C# geschrieben, so dass Sie leicht an Ihre Bedürfnisse anpassen.

  1. Die obige Datei sollte in eines der Projekte eingefügt werden. Ich habe ein neues Projekt mit nur dieser einen Datei erstellt, um die Technik der Versionsverwaltung Technik zu verdeutlichen. Wenn ich dieses Projekt erstelle (eigentlich muss ich es nicht einmal erstellen: Das Speichern der Datei reicht aus, um eine Visual Studio-Aktion auszulösen. Aktion auszulösen), wird die folgende C#-Datei erzeugt:
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

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

Ja, heute sind es 113 Tage seit dem 1. Januar 2010. Morgen wird sich die wird sich die Revisionsnummer ändern.

  1. Der nächste Schritt ist das Entfernen der Attribute AssemblyVersion und AssemblyFileVersion aus den AssemblyInfo.cs-Dateien in allen Projekten, die die die gleichen automatisch generierten Versionsinformationen haben sollen. Wählen Sie stattdessen "Add existing item" für jedes Projekt, navigieren Sie zu dem Ordner mit der T4 Vorlagendatei, wählen Sie die entsprechende ".cs"-Datei aus und fügen Sie sie als Link hinzu. Das war's schon!

Was mir an diesem Ansatz gefällt, ist, dass er leichtgewichtig ist (keine benutzerdefinierten MsBuild-Aufgaben), und die automatisch generierten Versionsinformationen werden nicht zur Versionskontrolle hinzugefügt werden. Und natürlich die Verwendung von C# für die Versionserstellung Algorithmus für Algorithmen beliebiger Komplexität geöffnet.

65voto

Drew Chapin Punkte 7389

Dies ist meine Umsetzung des T4-Vorschlags... Dadurch wird die Build-Nummer jedes Mal erhöht, wenn Sie das Projekt erstellen, unabhängig von der gewählten Konfiguration (d.h. Debug|Release), und die Revisionsnummer wird jedes Mal erhöht, wenn Sie einen Release-Build durchführen. Sie können die Haupt- und Unterversionsnummern weiterhin über Anwendung ➤ Montageinformationen...

Um das genauer zu erklären, werden die vorhandenen AssemblyInfo.cs Datei, und verwenden Sie regex, um die AssemblyVersion Informationen und erhöhen dann die Revisions- und Build-Nummern auf der Grundlage der Eingaben von TextTransform.exe .

  1. Löschen Sie Ihre bestehenden AssemblyInfo.cs Datei.

  2. Erstellen einer AssemblyInfo.tt Datei zu ersetzen. Visual Studio sollte Folgendes erstellen AssemblyInfo.cs und gruppieren Sie sie mit der T4-Datei, nachdem Sie die T4-Datei gespeichert haben.

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Text.RegularExpressions" #>
    <#
        string output = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\\(\"(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)");
        MatchCollection matches = pattern.Matches(output);
        if( matches.Count == 1 )
        {
            major = Convert.ToInt32(matches[0].Groups["major"].Value);
            minor = Convert.ToInt32(matches[0].Groups["minor"].Value);
            build = Convert.ToInt32(matches[0].Groups["build"].Value) + 1;
            revision = Convert.ToInt32(matches[0].Groups["revision"].Value);
            if( this.Host.ResolveParameterValue("-","-","BuildConfiguration") == "Release" )
                revision++;
        }
    #>
    
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.Resources;
    
    // General Information
    [assembly: AssemblyTitle("Insert title here")]
    [assembly: AssemblyDescription("Insert description here")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("Insert company here")]
    [assembly: AssemblyProduct("Insert product here")]
    [assembly: AssemblyCopyright("Insert copyright here")]
    [assembly: AssemblyTrademark("Insert trademark here")]
    [assembly: AssemblyCulture("")]
    
    // Version informationr(
    [assembly: AssemblyVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: AssemblyFileVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: NeutralResourcesLanguageAttribute( "en-US" )]
    
    <#+
        int major = 1;
        int minor = 0;
        int revision = 0;
        int build = 0;
    #>
  3. Fügen Sie dies zu Ihrem Pre-Build-Event hinzu:

    "%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt"

32voto

gideon Punkte 19091

Wenn Sie ein Sternchen für Build und Revision eingeben, verwendet Visual Studio die Anzahl der Tage seit dem 1. Januar 2000 als Build-Nummer und die Anzahl der Sekunden seit Mitternacht geteilt durch 2 als Revision.

Eine viel bessere, lebensrettende Lösung ist http://autobuildversion.codeplex.com/

Es funktioniert hervorragend und ist SEHR flexibel.

22voto

galets Punkte 16843

Hier ist die Zitat zu AssemblyInfo.cs von MSDN :

Sie können alle Werte angeben oder Sie können die Standard-Build-Nummer akzeptieren, Revisionsnummer oder beides akzeptieren, indem Sie ein Sternchen ( ). Zum Beispiel, [assembly:AssemblyVersion("2.3.25.1")] gibt 2 als die Hauptversion, 3 als die Nebenversion, 25 als Build-Nummer Nummer und 1 als Revisionsnummer an. Eine Versionsnummer wie [assembly:AssemblyVersion("1.2. ")] spezifiziert 1 als Hauptversion, 2 als die Nebenversion und akzeptiert die Standard-Build- und Revisionsnummern. A Versionsnummer wie z.B. [assembly:AssemblyVersion("1.2.15.*")] spezifiziert 1 als die Hauptversion, 2 als die Nebenversion, 15 als Build-Nummer Nummer, und akzeptiert die Standard Revisionsnummer. Die Standard-Build Nummer wird täglich inkrementiert. Die Standard Revisionsnummer ist zufällig

Dies bedeutet, dass, wenn Sie eine 1.1.* in die Assembly-Information eingeben, nur die Build-Nummer automatisch erhöht wird, und zwar nicht nach jedem Build, sondern täglich. Die Revisionsnummer wird sich bei jedem Build ändern, aber eher zufällig als inkrementell.

Dies ist wahrscheinlich für die meisten Anwendungsfälle ausreichend. Wenn das nicht das ist, wonach Sie suchen, müssen Sie ein Skript schreiben, das die Version # beim Schritt vor dem Build automatisch erhöht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X