Versionsnummer automatisch aktualisieren


108

Ich möchte, dass die Versionseigenschaft meiner Anwendung für jeden Build erhöht wird, bin mir jedoch nicht sicher, wie diese Funktionalität in Visual Studio (2005/2008) aktiviert werden soll. Ich habe versucht, die AssemblyVersion als 1.0 anzugeben. * Aber ich bekomme nicht genau das, was ich will.

Ich verwende auch eine Einstellungsdatei. Bei früheren Versuchen, als die Assembly-Version geändert wurde, wurden meine Einstellungen auf die Standardeinstellungen zurückgesetzt, da die Anwendung in einem anderen Verzeichnis nach der Einstellungsdatei gesucht hat.

Ich möchte in der Lage sein, eine Versionsnummer in Form von 1.1.38 anzuzeigen. Wenn ein Benutzer ein Problem feststellt, kann ich die von ihm verwendete Version protokollieren und ihn auffordern, ein Upgrade durchzuführen, wenn er eine alte Version hat.

Eine kurze Erklärung, wie die Versionierung funktioniert, wäre ebenfalls willkommen. Wann werden die Build- und Revisionsnummer erhöht?


Die folgende Frage bietet eine einfache und bequeme Lösung, wie Sie eine Build-Nummer in Ihre Anwendung einfügen können, indem Sie in einem Build-Ereignis eine Quelldatei generieren. stackoverflow.com/questions/4450231/…
Ashley Davis

Antworten:


96

Mit dem "Eingebauten" Zeug können Sie nicht, da die Verwendung von 1.0. * Oder 1.0.0. * Die Revision und die Build-Nummern durch einen codierten Datums- / Zeitstempel ersetzt, was normalerweise auch ein guter Weg ist.

Weitere Informationen finden Sie in der Assembly Linker- Dokumentation im Tag / v.

Verwenden Sie zum automatischen Inkrementieren von Zahlen die AssemblyInfo-Aufgabe:

AssemblyInfo-Aufgabe

Dies kann so konfiguriert werden, dass die Build-Nummer automatisch erhöht wird.

Es gibt 2 Fallstricke:

  1. Jede der 4 Zahlen in der Versionszeichenfolge ist auf 65535 beschränkt. Dies ist eine Windows-Einschränkung und wird wahrscheinlich nicht behoben.
  2. Die Verwendung mit with Subversion erfordert eine kleine Änderung:

Das Abrufen der Versionsnummer ist dann ganz einfach:

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);

Und um dies zu verdeutlichen: In .net oder zumindest in C # ist der Build tatsächlich die DRITTE Nummer, nicht die vierte, wie einige Leute (zum Beispiel Delphi-Entwickler, die an Major.Minor.Release.Build gewöhnt sind) erwarten könnten.

In .net ist es Major.Minor.Build.Revision.


3
Ich habe gerade dieses Visual Studio Add-In gefunden, das etwas Ähnliches tut: autobuildversion.codeplex.com
jrsconfitto

6
Bedeutet das, dass am 4. Juni 2179 die Microsoft-Standardversionsnummern nicht mehr funktionieren? (der 65536. Tag nach 2000)
Lloyd Powell

1
@Jugglingnutcase - dieser Link wäre nahezu perfekt, wenn er für aktuelle Versionen von Visual Studio
funktionieren würde

2
@SanuelJackson haha! Ja, das würde es. Schade, dass ich mit meinen Kommentaren von 2010 nicht Schritt halten kann, sorry! : P Der Lauf der Zeit und Versionen macht uns alle traurig.
jrsconfitto

@ Michael Stum: Könnten Sie bitte den Link für AssemblyInfo Task in Ihrer Antwort aktualisieren ? Für mich wird es nicht richtig geladen.
Matt

22

VS.NET setzt die Assembly-Version standardmäßig auf 1.0. * Und verwendet beim automatischen Inkrementieren die folgende Logik: Der Build-Teil wird auf die Anzahl der Tage seit dem 1. Januar 2000 und der Revisionsteil auf die Anzahl der Sekunden seit Mitternacht festgelegt. Ortszeit, geteilt durch zwei. Siehe diesen MSDN-Artikel .

Die Assembly-Version befindet sich in einer Datei assemblyinfo.vb oder assemblyinfo.cs. Aus der Datei:

' 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")> 

Vielen Dank für die Aufnahme des ersten Datums:January 1st, 2000
Kiewic

11

Ich habe festgestellt, dass es gut funktioniert, einfach das Datum des letzten Builds wie folgt anzuzeigen, wo immer eine Produktversion benötigt wird:

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

Anstatt zu versuchen, die Version von etwas wie dem folgenden zu erhalten:

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;
}

6
Ich denke du meinst das: yyyy.MM.dd.HHmm nicht yyyy.MM.dd.HHMM.
JHubbard80

1
Dies ist die einfachste Lösung, um eine Versionsnummer an die Änderung der Baugruppendatei anzuhängen.
Alexei

6

Welches Versionsverwaltungssystem verwenden Sie?

Fast alle von ihnen haben eine Art $ Id $ -Tag, das beim Einchecken der Datei erweitert wird.

Normalerweise verwende ich irgendeine Form von Hackery, um dies als Versionsnummer anzuzeigen.

Die andere Alternative ist die Verwendung des Datums als Build-Nummer: 080803-1448


Können Sie erweitern auf "Fast alle von ihnen haben eine Form von $ Id $ -Tag, das beim Einchecken der Datei erweitert wird". Wissen Sie speziell für Subversiion?
Greg B

3

[Visual Studio 2017, .csproj- Eigenschaften]

Um Ihre PackageVersion / Version / AssemblyVersion-Eigenschaft (oder eine andere Eigenschaft) automatisch zu aktualisieren, erstellen Sie zunächst eine neue Microsoft.Build.Utilities.TaskKlasse, die Ihre aktuelle Build-Nummer erhält, und senden Sie die aktualisierte Nummer zurück (ich empfehle, nur für diese Klasse ein separates Projekt zu erstellen).

Ich aktualisiere die major.minor-Nummern manuell, lasse aber MSBuild die Build-Nummer automatisch aktualisieren (1.1. 1 , 1.1. 2 , 1.1. 3 usw. :)

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;
    }

}

Rufen Sie dann Ihren kürzlich erstellten Task on MSBuild-Prozess auf und fügen Sie den nächsten Code in Ihre .csproj-Datei ein:

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

Wenn Sie die Visual Studio Pack-Projektoption BeforeTargets="Build"auswählen (wechseln Sie einfach zu, um die Aufgabe vor dem Erstellen auszuführen), wird der RefreshVersion-Code ausgelöst, um die neue Versionsnummer zu berechnen, und die XmlPokeAufgabe aktualisiert Ihre .csproj-Eigenschaft entsprechend (ja, die Datei wird geändert).

Bei der Arbeit mit NuGet-Bibliotheken sende ich das Paket auch an das NuGet-Repository, indem ich dem vorherigen Beispiel nur die nächste Build-Aufgabe hinzufüge.

<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\nugetHier habe ich den NuGet-Client (denken Sie daran, Ihren NuGet-API-Schlüssel durch Aufrufen zu speichern nuget SetApiKey <my-api-key>oder den Schlüssel in den NuGet-Push-Aufruf aufzunehmen).

Nur für den Fall, dass es jemandem hilft ^ _ ^.


1

Vor einiger Zeit habe ich eine schnelle und schmutzige Exe geschrieben, die die Versionsnummern in einer Assemblyinfo aktualisiert. {Cs / vb} - Ich habe auch rxfind.exe (ein einfaches und leistungsstarkes Regex-basiertes Such-Ersetzungs-Tool) verwendet, um dies zu tun Aktualisierung über eine Befehlszeile als Teil des Erstellungsprozesses. Ein paar andere hilfreiche Tipps:

  1. Teilen Sie die Baugruppeninfo in Produktteile (Firmenname, Version usw.) und montagespezifische Teile (Baugruppenname usw.) auf. Siehe hier
  2. Außerdem - ich verwende Subversion, daher fand ich es hilfreich, die Build-Nummer auf Subversion-Revisionsnummer zu setzen, wodurch es wirklich einfach ist, immer zu der Codebasis zurückzukehren, die die Assembly generiert hat (z. B. 1.4.100.1502 wurde aus Revision 1502 erstellt).

Wenn es sich um eine Codedatei ( .cs / .vb) handelt, sollten Sie stattdessen eine T4-Vorlage verwenden.
BrainSlugs83

0

Wenn Sie eine automatisch inkrementierende Nummer wünschen, die bei jeder Kompilierung aktualisiert wird, können Sie VersionUpdater aus einem Pre-Build-Ereignis verwenden. Ihr Pre-Build-Ereignis kann die Build-Konfiguration überprüfen, wenn Sie dies vorziehen, sodass die Versionsnummer nur für einen Release-Build erhöht wird (z. B.).


Interessant. Ich habe seit Jahren meine eigene mit dem gleichen Namen und wusste nicht, dass es eine gibt (obwohl ich sie erst kürzlich online gestellt habe): github.com/rjamesnw/VersionUpdater
James Wilkins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.