Automatycznie aktualizuj numer wersji

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

Używam również Pliku ustawień i we wcześniejszych próbach, gdy wersja assembly zmieniła moje ustawienia, został zresetowany do domyślnego, ponieważ aplikacja szukała pliku ustawień w innym katalogu.

I chciałbym móc wyświetlić numer wersji w postaci 1.1.38, więc gdy użytkownik znajdzie problem, mogę zalogować wersję, której używają, a także powiedzieć im, aby uaktualnili, jeśli mają stare wydanie.

Krótkie wyjaśnienie, jak działa wersjonowanie, byłoby również mile widziane. Kiedy numer kompilacji i wersji jest zwiększany?

Author: Drise, 2008-08-03

7 answers

Z" wbudowanymi " rzeczami, nie możesz, jak za pomocą 1.0.* lub 1.0.0.* zastąpi numery 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 Task

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

Jest 2 Gotchas:

  1. każda z 4 liczb w ciągu wersji jest ograniczona do 65535. Jest to ograniczenie systemu Windows i raczej nie zostanie naprawione.
  2. używanie z With Subversion wymaga małej zmiany:

Pobranie numeru wersji jest wtedy całkiem ł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#, build jest w rzeczywistości trzecim numerem, a nie czwartym, jak niektórzy ludzie (na przykład programiści Delphi, którzy są przyzwyczajeni do głównych.Drobne.Uwolnij.Build) może się spodziewać.

W. net, to jest Major.Drobne.Buduj.Rewizja.

 88
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 04:10:16

VS.NET domyślnie Wersja Assembly to 1.0.* i używa następującej logiki podczas automatycznego zwiększania: ustawia część kompilacji na liczbę dni od 1 stycznia 2000 r. i ustawia część revision na liczbę sekund od północy, czasu lokalnego, podzieloną przez dwa. Zobacz ten artykuł MSDN .

Wersja Assembly znajduje się w assemblyinfo.vb lub assemblyinfo.plik 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")> 
 19
Author: Solracnapod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-29 03:25:13

Odkryłem, że dobrze jest po prostu wyświetlać datę ostatniego kompilacji, używając poniższej wersji produktu:

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

Zamiast próbować pobrać wersję z czegoś takiego jak poniżej:

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;
}
 8
Author: user8128167,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-25 16:30:27

Jakiego systemu kontroli źródła używasz?

Prawie wszystkie z nich mają jakąś formę $ Id $ tag, która jest rozwijana po sprawdzeniu pliku.

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

Inną alternatywą jest użycie daty jako numeru kompilacji: 080803-1448

 6
Author: engtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-03 18:46:33

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

Aby automatycznie zaktualizować właściwość PackageVersion/Version/AssemblyVersion (lub jakąkolwiek inną właściwość), najpierw Utwórz nową klasę Microsoft.Build.Utilities.Task, która otrzyma Twój bieżący numer kompilacji i odeśle zaktualizowany numer (polecam utworzyć osobny projekt tylko dla tej klasy).

Ręcznie aktualizuję majora.liczby podrzędne, ale niech MSBuild automatycznie zaktualizuje 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 ostatnio utworzone zadanie w procesie MSBuild dodając następny kod na Twoim.plik 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 Visual Studio Pack project (po prostu zmień na {[4] } w celu wykonania zadania przed kompilacją) zostanie uruchomiony kod RefreshVersion, aby obliczyć nowy numer wersji, a XmlPoke zadanie zaktualizuje Twoją .właściwość csproj (tak, zmieni plik).

Podczas pracy z NuGet biblioteki, ja również wysyłam pakiet do repozytorium NuGet dodając kolejne zadanie build 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\nuget jest tam, gdzie mam klienta NuGet (pamiętaj, aby zapisać swój klucz API NuGet przez wywołanie nuget SetApiKey <my-api-key> lub dołączyć klucz do połączenia push NuGet).

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

 2
Author: Nacho Coll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 14:28:41

Jakiś czas temu napisałem szybki i brudny exe, który zaktualizowałby wersję #'s W assemblyinfo.{cs / vb} - użyłem również rxfind.exe (proste i potężne narzędzie wyszukiwania regex), aby wykonać aktualizację z wiersza poleceń jako część procesu budowania. Kilka innych podpowiedzi:

  1. rozdziel assemblyinfo na części produktu (Nazwa firmy, wersja, itp.) i specyficzne części montażowe (nazwa zespołu itp.). Zobacz tutaj
  2. również-używam subversion, dlatego pomocne okazało się ustawienie numeru kompilacji na numer wersji subversion, dzięki czemu naprawdę łatwo jest zawsze wrócić do bazy kodu, która wygenerowała zestaw (np. 1.4.100.1502 został zbudowany z wersji 1502).
 1
Author: caryden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 19:51:49

Jeśli chcesz mieć automatycznie zwiększający się numer, który aktualizuje się za każdym razem, gdy kompilacja jest wykonywana, możesz użyć VersionUpdater ze zdarzenia pre-build. Zdarzenie pre-build może sprawdzić konfigurację kompilacji, jeśli wolisz, aby Numer wersji był zwiększany tylko dla kompilacji wydania (na przykład).

 0
Author: user283258,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 21:16:35