Automatycznie zaktualizować numer wersji

głosy
95

Chciałbym właściwość wersję mojej aplikacji do zwiększana dla każdej budowie, ale nie jestem pewien, w jaki sposób włączyć tę funkcję w Visual Studio (2005/2008). Próbowałem określić AssemblyVersion jako 1.0. *, Ale nie żeby mnie dokładnie to, co chcę.

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

Chciałbym być w stanie wyświetlić numer wersji w postaci 1.1.38 więc gdy użytkownik znajdzie problem mogę się zalogować wersję ich użyciu, a także powiedzieć im, aby uaktualnić jeśli mają starą uwolnienia.

Krótkie wyjaśnienie jak działa wersjonowania będzie również mile widziane. Kiedy numer kompilacji i rewizja uzyskać zwiększony?

Utwórz 03/08/2008 o 12:12
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
85

Z „Zbudowany w” rzeczy, a nie przy użyciu 1,0 możesz,. * Lub 1.0.0. * Zastąpi rewizji i budować liczb z zakodowaną datę / znacznik czasu, który zwykle jest również dobrym sposobem.

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

Jeśli chodzi o numery automatycznie zwiększany, użyj AssemblyInfo zadanie:

Zadanie AssemblyInfo

To może być skonfigurowany do automatycznego przyrostu numer kompilacji.

Istnieją 2 pułapek:

  1. Każdy z 4 liczb w ciąg wersja jest ograniczona do 65535. To jest Windows Ograniczenie i mało prawdopodobne, aby uzyskać stałe.
  2. Korzystanie z z Subversion wymaga niewielkiej zmiany:

Odzyskiwanie wersja ma numer wtedy dość proste:

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 wyjaśnienie: w .NET lub przynajmniej w języku C #, kompilacja jest faktycznie Trzecia liczba, a nie jako jedna czwarta niektórych osób (np Delphi programistów, którzy są wykorzystywane do Major.Minor.Release.Build) może spodziewać.

W .NET, to Major.Minor.Build.Revision.

Odpowiedział 03/08/2008 o 12:41
źródło użytkownik

głosy
6

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

Prawie wszystkie z nich mają jakąś formę $ ID $ tag, który zostanie rozszerzony, gdy plik jest sprawdzana.

Zwykle używam jakąś formę hackery aby wyświetlić to jako numer wersji.

Drugą alternatywą jest użyć, aby korzystać datę jako numer kompilacji: 080803-1448

Odpowiedział 03/08/2008 o 19:46
źródło użytkownik

głosy
1

Jakiś czas temu pisałem szybki i brudny exe, które zaktualizować wersję # 's w AssemblyInfo {cs / vb}. - Ja też stosować rxfind.exe (proste i skuteczne wyszukiwanie regex opartych zastąpić narzędzia) aby zrobić to aktualizacji z linii poleceń jako część procesu kompilacji. Kilka innych wskazówek helpfule:

  1. oddzielić AssemblyInfo na części produktów (nazwa, wersja, itd.) oraz montaż poszczególnych części (nazwa montaż etc.). Zobacz tutaj
  2. Również - używam Subversion, więc znalazłem to pomocne, aby ustawić numer kompilacji z numerem wersji SVN co czyni go bardzo łatwo zawsze wrócić na kodzie, który wygenerował montażu (np 1.4.100.1502 został zbudowany z rewizji 1502).
Odpowiedział 04/08/2008 o 20:51
źródło użytkownik

głosy
19

Domyślne VS.NET wersji zespołu do 1,0 * i wykorzystuje następującą logikę gdy autoinkrementacja. Ustawia część kompilacji z liczbą dni od 1 stycznia 2000 roku i określa część wersji na liczbę sekund od północy, czas miejscowy, podzielona przez dwa. Zobacz ten artykuł MSDN .

Wersja montażu 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")> 
Odpowiedział 30/09/2008 o 21:58
źródło użytkownik

głosy
0

Jeśli chcesz numer inkrementacji auto, który aktualizuje za każdym razem kompilacja jest zrobione, można użyć VersionUpdater ze zdarzenia pre-build. Wydarzenie pre-build może sprawdzić konfigurację kompilacji jeśli wolisz tak, że numer wersji będzie zwiększać tylko do kompilacji Release (na przykład).

Odpowiedział 28/02/2010 o 22:16
źródło użytkownik

głosy
8

Przekonałem się, że to działa dobrze, po prostu wyświetla datę ostatniej kompilacji przy użyciu następujących wszędzie tam, gdzie potrzebna jest wersja produktu:

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

Zamiast próbuje dostać wersję z czymś takim, co następuje:

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;
}
Odpowiedział 04/03/2013 o 21:58
źródło użytkownik

głosy
2

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

Aby automatycznie zaktualizować właściwość PackageVersion / Version / AssemblyVersion (lub innego mienia), najpierw należy utworzyć nową Microsoft.Build.Utilities.Taskklasę, która dostanie swój aktualny numer kompilacji i odesłać zaktualizowany numer (polecam utworzyć osobny projekt tylko dla tej klasy).

I ręcznie zaktualizować MAJOR.MINOR liczb, ale niech MSBuild automatycznie zaktualizować 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 zadzwonić do niedawno utworzonego zadania na proces MSBuild dodaniem następnego kodu w 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 programu Visual Studio Pack dla projektu (wystarczy zmienić BeforeTargets="Build"za wykonanie zadania przed produkcji) kod RefreshVersion zostanie uruchomiony, aby obliczyć nowy numer wersji, a XmlPokezadanie będzie aktualizować swoją nieruchomość .csproj odpowiednio (tak, to zmodyfikować plik).

Podczas pracy z bibliotekami Nuget, ja również wysłać pakiet do Nuget repozytorium po prostu dodając kolejne zadanie gromadzenie jak w poprzednim przykładzie.

<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\nugetgdzie mam klienta Nuget (pamiętaj, aby zapisać swój klucz API Nuget dzwoniąc nuget SetApiKey <my-api-key>lub włączenie przycisku na wezwanie Push Nuget).

Tylko w przypadku, gdy ktoś pomaga ^ _ ^.

Odpowiedział 10/05/2017 o 14:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more