Sürüm numarasını otomatik olarak güncelle


108

Uygulamamın sürüm özelliğinin her derleme için artırılmasını istiyorum, ancak bu işlevselliği Visual Studio'da (2005/2008) nasıl etkinleştireceğimden emin değilim. AssemblyVersion'ı 1.0. * Olarak belirlemeye çalıştım ama bana tam olarak istediğimi vermiyor.

Ayrıca bir ayarlar dosyası kullanıyorum ve önceki denemelerde, derleme sürümü değiştiğinde, uygulama ayarlar dosyasını başka bir dizinde aradığından ayarlarım varsayılana sıfırlandı.

Sürüm numarasını 1.1.38 biçiminde görüntüleyebilmek istiyorum, böylece bir kullanıcı bir sorun bulduğunda kullandığı sürümü günlüğe kaydedebilir ve eski bir sürüme sahipse yükseltmelerini söyleyebilirim.

Versiyonlama işleminin nasıl çalıştığına dair kısa bir açıklama da takdir edilecektir. Yapım ve revizyon numarası ne zaman artar?


Aşağıdaki soru, bir yapı olayında bir kaynak dosyası oluşturarak bir yapı numarasının uygulamanıza nasıl ekleneceğine ilişkin basit ve kullanışlı bir çözüme sahiptir. stackoverflow.com/questions/4450231/…
Ashley Davis

Yanıtlar:


96

1.0. * Veya 1.0.0. * Kullanıldığında, "Yerleşik" malzeme ile yapamazsınız, çünkü revizyonu değiştirir ve sayıları kodlanmış bir tarih / zaman damgasıyla oluşturur, bu da genellikle iyi bir yoldur.

Daha fazla bilgi için / v etiketindeki Assembly Linker Belgelerine bakın .

Otomatik olarak artan sayılara gelince, AssemblyInfo Görevini kullanın:

AssemblyInfo Görevi

Bu, yapı numarasını otomatik olarak artıracak şekilde yapılandırılabilir.

2 Gotcha vardır:

  1. Sürüm dizesindeki 4 sayıdan her biri 65535 ile sınırlıdır. Bu bir Windows Sınırlamasıdır ve muhtemelen düzeltilmesi beklenmez.
  2. Subversion ile kullanmak küçük bir değişiklik gerektirir:

Sürüm numarasını almak o zaman oldukça kolaydır:

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

Ve açıklığa kavuşturmak için: .net veya en azından C # 'da, yapı aslında ÜÇÜNCÜ sayıdır, bazı insanların (örneğin Major.Minor.Release.Build'e alışkın Delphi Geliştiricileri) beklediği gibi dördüncü değil.

.Net'te, Major.Minor.Build.Revision.


3
benzer bir şey yapan bu görsel stüdyo eklentisini buldum: autobuildversion.codeplex.com
jrsconfitto

6
Bu, 4 Haziran 2179'da Microsoft varsayılan sürüm numaralarının bozulacağı anlamına mı geliyor? (2000'den sonraki 65536. gün)
Lloyd Powell

1
@Jugglingnutcase - görsel stüdyonun mevcut sürümleri için çalışsaydı bu bağlantı mükemmele yakın olurdu
Kraang Prime

2
@SanuelJackson haha! evet olur. çok kötü, 2010'daki yorumlarıma yetişemiyorum, üzgünüm! : P Zamanın yürüyüşü ve versiyonları hepimizi üzüyor.
jrsconfitto

@Michael Stum: Cevabınızda AssemblyInfo Task bağlantısını günceller misiniz lütfen? Benim için doğru yüklenmiyor.
Matt

22

VS.NET, Assembly sürümünü varsayılan olarak 1.0. * Olarak ayarlar ve otomatik artırmada aşağıdaki mantığı kullanır: derleme bölümünü 1 Ocak 2000'den bu yana geçen gün sayısına ayarlar ve revizyon bölümünü gece yarısından bu yana geçen saniye sayısına ayarlar, yerel saat ikiye bölünür. Bu MSDN makalesine bakın .

Assembly sürümü, assemblyinfo.vb veya assemblyinfo.cs dosyasında bulunur. Dosyadan:

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

İlk tarihi dahil ettiğiniz için teşekkürler:January 1st, 2000
kiewic

11

Bir ürün sürümünün gerekli olduğu her yerde aşağıdakileri kullanarak son derlemenin tarihini basitçe göstermenin işe yaradığını buldum:

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

Sürümü aşağıdaki gibi bir şeyden almaya çalışmak yerine:

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
Sanırım şunu kastediyorsunuz: yyyy.MM.dd.HHmm yyyy.MM.dd.HHMM değil.
JHubbard80

1
Bu, montaj dosyası değişikliğine bir tür sürüm numarasının eklenmesi için en basit çözümdür.
Alexei

6

Hangi kaynak kontrol sistemini kullanıyorsunuz?

Neredeyse hepsinde, dosya iade edildiğinde genişleyen bir tür $ Id $ etiketi vardır.

Bunu sürüm numarası olarak göstermek için genellikle bir çeşit bilgisayar korsanlığı kullanıyorum.

Diğer alternatif ise tarihi yapı numarası olarak kullanmaktır: 080803-1448


"Hemen hemen hepsinde, dosya teslim edildiğinde genişleyen bir tür $ Id $ etiketi var" ifadesini genişletebilir misiniz? Özellikle yıkıcılık için biliyor musunuz?
Greg B

3

[Visual Studio 2017, .csproj özellikleri]

PackageVersion / Version / AssemblyVersion özelliğinizi (veya başka herhangi bir mülkü) otomatik olarak güncellemek için, önce Microsoft.Build.Utilities.Taskmevcut yapı numaranızı alacak ve güncellenmiş numarayı geri gönderecek yeni bir sınıf oluşturun (sadece bu sınıf için ayrı bir proje oluşturmanızı öneririm).

Büyük.minor sayıları manuel olarak güncelliyorum, ancak MSBuild'in yapı numarasını otomatik olarak güncellemesine izin veriyorum (1.1. 1 , 1.1. 2 , 1.1. 3 , vb. :)

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

}

Daha sonra MSBuild işleminde son oluşturduğunuz Görev'i çağırarak sonraki kodu .csproj dosyanıza ekleyin:

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

Visual Studio Pack proje seçeneğini seçerken (yalnızca BeforeTargets="Build", Oluşturmadan önce görevi yürütmek için değiştirin ), RefreshVersion kodu yeni sürüm numarasını hesaplamak için tetiklenir ve XmlPokegörev .csproj özelliğinizi buna göre günceller (evet, dosyayı değiştirir).

NuGet kitaplıkları ile çalışırken, sadece bir sonraki derleme görevini önceki örneğe ekleyerek paketi NuGet deposuna da gönderiyorum.

<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\nugetNuGet istemcisine sahip olduğum yerdir ( nuget SetApiKey <my-api-key>NuGet push çağrısına anahtarı çağırarak veya anahtarı dahil ederek NuGet API anahtarınızı kaydetmeyi unutmayın ).

Birine yardım etmesi ihtimaline karşı ^ _ ^.


1

Bir süre önce, bir assemblyinfo'daki sürüm numaralarını güncelleyecek hızlı ve kirli bir exe yazdım. {Cs / vb} - Ayrıca rxfind.exe'yi (basit ve güçlü bir regex tabanlı arama değiştirme aracı) kullandım. oluşturma işleminin bir parçası olarak bir komut satırından güncelleme. Birkaç başka yardımcı ipucu:

  1. montaj bilgilerini ürün parçalarına (şirket adı, versiyonu vb.) ve montaja özgü parçalara (montaj adı vb.) ayırın. Buraya bakın
  2. Ayrıca - alt sürüm kullanıyorum, bu yüzden derleme numarasını alt sürüm revizyon numarasına ayarlamayı yararlı buldum ve böylece montajı oluşturan kod tabanına her zaman geri dönmeyi gerçekten kolaylaştırdı (ör. 1.4.100.1502, revizyon 1502'den oluşturuldu).

Kod dosyası ( .cs / .vb) içinse , bunun yerine bir T4 şablonu kullanmalısınız.
BrainSlugs83

0

Her derleme yapıldığında güncellenen otomatik olarak artan bir sayı istiyorsanız, VersionUpdater'ı bir derleme öncesi olayından kullanabilirsiniz. Derleme öncesi etkinliğiniz, tercih ederseniz derleme yapılandırmasını kontrol edebilir, böylece sürüm numarası yalnızca bir Sürüm derlemesi için artacaktır (örneğin).


İlginç. Yıllardır aynı adı taşıyan kendi adıma sahiptim
James Wilkins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.