Automatycznie aktualizuj numer wersji

108

Chciałbym, aby właściwość wersji mojej aplikacji była zwiększana dla każdej kompilacji, ale nie jestem pewien, jak włączyć tę funkcję w programie Visual Studio (2005/2008). Próbowałem określić AssemblyVersion jako 1.0. *, Ale nie daje mi to dokładnie tego, czego chcę.

Używam również pliku ustawień i we wcześniejszych próbach, gdy wersja zestawu zmieniła moje ustawienia, zostały zresetowane do wartości domyślnych, ponieważ aplikacja szukała pliku ustawień w innym katalogu.

Chciałbym móc wyświetlić numer wersji w postaci 1.1.38, więc gdy użytkownik znajdzie problem, mogę zalogować używaną wersję, a także powiedzieć mu, aby zaktualizował, jeśli ma starą wersję.

Byłoby również mile widziane krótkie wyjaśnienie, jak działa wersjonowanie. Kiedy zwiększa się numer kompilacji i rewizji?

Robert Höglund
źródło
Poniższe pytanie ma proste i wygodne rozwiązanie, jak wprowadzić numer kompilacji do aplikacji, generując plik źródłowy w zdarzeniu kompilacji. stackoverflow.com/questions/4450231/…
Ashley Davis

Odpowiedzi:

96

W przypadku elementów „Wbudowanych” nie można, ponieważ użycie wersji 1.0. * Lub 1.0.0. * Zastąpi numer wersji i kompilacji zakodowaną datą / znacznikiem czasu, co zwykle jest również dobrym sposobem.

Aby uzyskać więcej informacji, zobacz dokumentację Assembly Linker w tagu / v.

Jeśli chodzi o automatyczne zwiększanie liczb, użyj zadania AssemblyInfo:

AssemblyInfo Zadanie

Można to skonfigurować tak, aby automatycznie zwiększać numer kompilacji.

Istnieją 2 pułapki:

  1. Każda z 4 liczb w ciągu Version jest ograniczona do 65535. Jest to ograniczenie systemu Windows i jest mało prawdopodobne, aby zostało naprawione.
  2. Używanie z z Subversion wymaga niewielkiej zmiany:

Odzyskanie numeru wersji jest wtedy dość łatwe:

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

I dla wyjaśnienia: w .net lub przynajmniej w C # kompilacja jest w rzeczywistości TRZECIM numerem, a nie czwartym, jak niektórzy ludzie (na przykład Delphi Developers, którzy są przyzwyczajeni do Major.Minor.Release.Build) mogą się spodziewać.

W .net jest to Major.Minor.Build.Revel.

Michael Stum
źródło
3
Właśnie znalazłem ten dodatek Visual Studio, który robi coś podobnego: autobuildversion.codeplex.com
jrsconfitto
6
Czy to oznacza, że ​​4 czerwca 2179 r. Zostaną zerwane domyślne numery wersji Microsoft? (65536 dzień po 2000 r.)
Lloyd Powell
1
@Jugglingnutcase - ten link byłby prawie idealny, gdyby działał w obecnych wersjach Visual Studio
Kraang Prime
2
@SanuelJackson haha! tak, byłoby. szkoda, nie nadążam za moimi komentarzami z 2010 roku, przepraszam! : P Bieg czasu i wersje zasmucają nas wszystkich.
jrsconfitto
@Michael Stum: Czy mógłbyś zaktualizować link do zadania AssemblyInfo w swojej odpowiedzi? U mnie nie ładuje się poprawnie.
Matt
22

VS.NET domyślnie ustawia wersję zestawu na 1.0. * I używa następującej logiki podczas auto-inkrementacji: ustawia część kompilacji na liczbę dni od 1 stycznia 2000 r., A część rewizji na liczbę sekund od północy, czas lokalny podzielony przez dwa. Zobacz ten artykuł MSDN .

Wersja zestawu znajduje się w pliku assemblyinfo.vb lub assemblyinfo.cs. Z pliku:

' 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")> 
Solracnapod
źródło
Dzięki za January 1st, 2000
podanie
11

Zauważyłem, że działa dobrze, aby po prostu wyświetlić datę ostatniej kompilacji, używając następujących, gdy potrzebna jest wersja produktu:

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

Zamiast próbować pobrać wersję z czegoś podobnego do następującego:

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
źródło
6
Myślę, że masz na myśli to: rrrr.MM.dd.HHmm, a nie rrrr.MM.dd.HHMM.
JHubbard80
1
Jest to najprostsze rozwiązanie polegające na dołączeniu jakiegoś numeru wersji do zmiany pliku zespołu.
Alexei
6

Z jakiego systemu kontroli źródła korzystasz?

Prawie wszystkie z nich mają jakąś formę tagu $ Id $, który jest rozwijany po wpisaniu pliku.

Zwykle używam jakiejś formy hakowania, aby wyświetlić to jako numer wersji.

Inną możliwością jest użycie daty jako numeru kompilacji: 080803-1448

engtech
źródło
Czy możesz rozwinąć „Prawie wszystkie z nich mają jakąś formę tagu $ Id $, który jest rozwijany, gdy plik jest wpisany”. A konkretnie, czy wiesz o wywrotce?
Greg B.
3

[Visual Studio 2017, właściwości .csproj ]

Aby automatycznie zaktualizować właściwość PackageVersion / Version / AssemblyVersion (lub dowolną inną właściwość), najpierw utwórz nową Microsoft.Build.Utilities.Taskklasę, która otrzyma aktualny numer kompilacji i odeśle zaktualizowany numer (zalecam utworzenie osobnego projektu tylko dla tej klasy).

Aktualizuję ręcznie numery major.minor, ale pozwalam MSBuild automatycznie aktualizować numer kompilacji (1.1. 1 , 1.1. 2 , 1.1. 3 itd. :)

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

}

Następnie wywołaj niedawno utworzone zadanie w procesie MSBuild, dodając następny kod do pliku .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>
 ..

Podczas wybierania opcji projektu pakietu Visual Studio Pack (po prostu zmień BeforeTargets="Build"na wykonanie zadania przed kompilacją) kod RefreshVersion zostanie wyzwolony w celu obliczenia nowego numeru wersji, a XmlPokezadanie odpowiednio zaktualizuje twoją właściwość .csproj (tak, zmodyfikuje plik).

Podczas pracy z bibliotekami NuGet wysyłam również pakiet do repozytorium NuGet, po prostu dodając następne zadanie kompilacji do poprzedniego przykładu.

<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\nugetjest miejsce, w którym mam klienta NuGet (pamiętaj, aby zapisać klucz interfejsu API NuGet przez wywołanie nuget SetApiKey <my-api-key>lub dołączenie klucza do wywołania wypychanego NuGet).

Na wszelki wypadek, gdyby to komuś pomogło ^ _ ^.

Nacho Coll
źródło
1

Jakiś czas temu napisałem szybki i brudny plik exe, który aktualizowałby numer wersji w informacjach o montażu. {Cs / vb} - Użyłem również rxfind.exe (prostego i potężnego narzędzia do zamiany wyszukiwania opartego na wyrażeniach regularnych), aby wykonać aktualizacja z wiersza poleceń w ramach procesu kompilacji. Kilka innych przydatnych wskazówek:

  1. rozdzielić informacje o zespole na części produktu (nazwa firmy, wersja itp.) i części specyficzne dla zespołu (nazwa zespołu itp.). Zobacz tutaj
  2. Ponadto - używam subversion, więc uznałem, że pomocne jest ustawienie numeru kompilacji na numer wersji subversion, dzięki czemu bardzo łatwo jest zawsze wrócić do bazy kodu, która wygenerowała zestaw (np. 1.4.100.1502 został zbudowany z wersji 1502).
caryden
źródło
Jeśli jest to plik kodu ( .cs / .vb), należy zamiast tego użyć szablonu T4.
BrainSlugs83
0

Jeśli chcesz, aby liczba automatycznie zwiększająca się, aktualizowana za każdym razem, gdy kompilacja jest ukończona, możesz użyć narzędzia VersionUpdater ze zdarzenia poprzedzającego kompilację. Twoje zdarzenie przed kompilacją może sprawdzić konfigurację kompilacji, jeśli wolisz, aby numer wersji był zwiększany tylko w przypadku kompilacji wydania (na przykład).

user283258
źródło
Ciekawy. Miałem mój własny od lat z tą samą nazwą i nie wiedział, że jeden istniał (choć ja po prostu umieścić go w Internecie niedawna): github.com/rjamesnw/VersionUpdater
James Wilkins