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.

16voto

Micah Smith Punkte 301

AssemblyInfo.cs verwenden

Erstellen Sie die Datei in App_Code: und füllen Sie die folgenden Felder aus oder verwenden Sie Google, um andere Attribute/Eigenschaften zu finden.

AssemblyInfo.cs

using System.Reflection;

[assembly: AssemblyDescription("Very useful stuff here.")]
[assembly: AssemblyCompany("companyname")]
[assembly: AssemblyCopyright("Copyright © me 2009")]
[assembly: AssemblyProduct("NeatProduct")]
[assembly: AssemblyVersion("1.1.*")]

AssemblyVersion ist der Teil, den Sie wirklich suchen.

Wenn Sie dann an einer Website arbeiten, können Sie in einer beliebigen aspx-Seite oder einem Steuerelement im <Page>-Tag Folgendes hinzufügen

CompilerOptions="<folderpath>\App_Code\AssemblyInfo.cs"

(wobei der Ordnerpfad natürlich durch die entsprechende Variable ersetzt wird).

Ich glaube nicht, dass Sie Compiler-Optionen in irgendeiner Weise für andere Klassen hinzufügen müssen; alle in der App_Code sollte die Version Informationen erhalten, wenn sie kompiliert werden.

Ich hoffe, das hilft.

13voto

Dmi7ry Punkte 1748
  • Stern in der Version (wie "2.10.3.*") - das ist einfach, aber die Zahlen sind zu groß

  • AutoBuildVersion - sieht gut aus, aber es funktioniert nicht mit meinem VS2010.

  • Das Skript von @DrewChapin funktioniert, aber ich kann in meinem Studio keine unterschiedlichen Modi für das Debug Pre-Build Event und das Release Pre-Build Event einstellen.

also habe ich das Skript ein wenig verändert... Befehl:

"%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\10.0\TextTransform.exe" -a !!$(ConfigurationName)!1 "$(ProjectDir)Properties\AssemblyInfo.tt"

und Skript (dies gilt für die Konfigurationen "Debug" und "Release"):

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
    int incRevision = 1;
    int incBuild = 1;

    try { incRevision = Convert.ToInt32(this.Host.ResolveParameterValue("","","Debug"));} catch( Exception ) { incBuild=0; }
    try { incBuild = Convert.ToInt32(this.Host.ResolveParameterValue("","","Release")); } catch( Exception ) { incRevision=0; }
    try {
        string currentDirectory = Path.GetDirectoryName(Host.TemplateFile);
        string assemblyInfo = File.ReadAllText(Path.Combine(currentDirectory,"AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\\(\"\\d+\\.\\d+\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)");
        MatchCollection matches = pattern.Matches(assemblyInfo);
        revision = Convert.ToInt32(matches[0].Groups["revision"].Value) + incRevision;
        build = Convert.ToInt32(matches[0].Groups["build"].Value) + incBuild;
    }
    catch( Exception ) { }
#>
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Game engine. Keys: F2 (Debug trace), F4 (Fullscreen), Shift+Arrows (Move view). ")]
[assembly: AssemblyProduct("Game engine")]
[assembly: AssemblyDescription("My engine for game")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCopyright("Copyright © Name 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. Only Windows
// assemblies support COM.
[assembly: ComVisible(false)]

// On Windows, the following GUID is for the ID of the typelib if this
// project is exposed to COM. On other platforms, it unique identifies the
// title storage container when deploying this assembly to the device.
[assembly: Guid("00000000-0000-0000-0000-000000000000")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
[assembly: AssemblyVersion("0.1.<#= this.revision #>.<#= this.build #>")]
[assembly: AssemblyFileVersion("0.1.<#= this.revision #>.<#= this.build #>")]

<#+
    int revision = 0;
    int build = 0;
#>

9voto

Mun Punkte 13868

Sie könnten versuchen, UpdateVersion von Matt Griffith zu verwenden. Es ist zwar schon ziemlich alt, funktioniert aber gut. Um es zu verwenden, müssen Sie einfach ein Pre-Build-Ereignis einrichten, das auf Ihre AssemblyInfo.cs-Datei verweist, und die Anwendung wird die Versionsnummern entsprechend aktualisieren, wie in den Befehlszeilenargumenten angegeben.

Da es sich um eine Open-Source-Anwendung handelt, habe ich auch eine Version erstellt, um die Versionsnummer nach folgendem Format zu erhöhen (Hauptversion).(Nebenversion).([Jahr][Tag des Jahres]).(Schrittweite) . Ich habe den Code für meine modifizierte Version der UpdateVersion-Anwendung auf GitHub veröffentlicht: https://github.com/munr/UpdateVersion

2voto

Raymond Punkte 173

Sie können eine erweiterte Versionierung mit Build-Skripten wie Versionierung erstellen

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