Perbarui nomor versi secara otomatis

108

Saya ingin properti versi aplikasi saya bertambah untuk setiap build tetapi saya tidak yakin tentang cara mengaktifkan fungsionalitas ini di Visual Studio (2005/2008). Saya telah mencoba untuk menentukan AssemblyVersion sebagai 1.0. * Tetapi tidak mendapatkan apa yang saya inginkan.

Saya juga menggunakan file pengaturan dan dalam upaya sebelumnya ketika versi perakitan mengubah pengaturan saya direset ke default karena aplikasi mencari file pengaturan di direktori lain.

Saya ingin menampilkan nomor versi dalam bentuk 1.1.38 sehingga ketika pengguna menemukan masalah, saya dapat mencatat versi yang mereka gunakan serta memberitahu mereka untuk meningkatkan jika mereka memiliki rilis lama.

Penjelasan singkat tentang cara kerja pembuatan versi juga akan dihargai. Kapan nomor build dan revisi bertambah?

Robert Höglund
sumber
Pertanyaan berikut memiliki solusi mudah yang sederhana tentang cara memasukkan nomor build ke dalam aplikasi Anda dengan membuat file sumber dalam acara build. stackoverflow.com/questions/4450231/…
Ashley Davis

Jawaban:

96

Dengan item "Built in", Anda tidak bisa, karena menggunakan 1.0. * Atau 1.0.0. * Akan mengganti revisi dan nomor build dengan tanggal / stempel waktu berkode, yang biasanya juga merupakan cara yang baik.

Untuk info lebih lanjut, lihat Dokumentasi Assembly Linker di tag / v.

Adapun untuk menambah angka secara otomatis, gunakan Tugas AssemblyInfo:

Tugas AssemblyInfo

Ini dapat dikonfigurasi untuk menaikkan nomor build secara otomatis.

Ada 2 Gotcha:

  1. Masing-masing dari 4 angka dalam string Versi dibatasi hingga 65535. Ini adalah Batasan Windows dan tidak mungkin diperbaiki.
  2. Menggunakan with dengan Subversion membutuhkan sedikit perubahan:

Mengambil nomor Versi cukup mudah:

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

Dan, untuk memperjelas: Dalam .net atau setidaknya di C #, build sebenarnya adalah nomor KETIGA, bukan yang keempat seperti yang diharapkan beberapa orang (misalnya Delphi Developers yang terbiasa dengan Major.Minor.Release.Build).

Dalam .net, ini adalah Major.Minor.Build.Revision.

Michael Stum
sumber
3
saya baru saja menemukan add-in studio visual ini yang melakukan hal serupa: autobuildversion.codeplex.com
jrsconfitto
6
Apakah itu berarti bahwa pada 4 Juni 2179 nomor versi default Microsoft akan rusak? (hari ke 65536 setelah tahun 2000)
Lloyd Powell
1
@Jugglingnutcase - tautan itu akan hampir sempurna, jika berfungsi untuk versi studio visual saat ini
Kraang Prime
2
@Sanuelson haha! ya itu akan. sayang sekali saya tidak mengikuti komentar saya dari tahun 2010, maaf! : P Pawai waktu dan versi membuat sedih kita semua.
jrsconfitto
@Michael Stum: Bisakah Anda memperbarui tautan untuk Tugas AssemblyInfo dalam jawaban Anda? Bagi saya, ini tidak dimuat dengan benar.
Matt
22

VS.NET menetapkan versi Perakitan secara default ke 1.0. * Dan menggunakan logika berikut saat penambahan otomatis: ini menetapkan bagian build ke jumlah hari sejak 1 Januari 2000, dan menetapkan bagian revisi ke jumlah detik sejak tengah malam, waktu setempat, dibagi dua. Lihat artikel MSDN ini .

Versi assembly terletak di file assemblyinfo.vb atau assemblyinfo.cs. Dari file:

' 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
sumber
Terima kasih telah memasukkan tanggal awal:January 1st, 2000
kiewic
11

Saya telah menemukan bahwa itu berfungsi dengan baik untuk hanya menampilkan tanggal pembuatan terakhir menggunakan berikut ini di mana pun versi produk diperlukan:

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

Daripada mencoba mendapatkan versi dari sesuatu seperti berikut:

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;
}
pengguna8128167
sumber
6
Saya pikir maksud Anda ini: yyyy.MM.dd.HHmm bukan yyyy.MM.dd.HHMM.
JHubbard80
1
Ini adalah solusi paling sederhana untuk memiliki beberapa jenis nomor versi yang dilampirkan ke perubahan file assembly.
Alexei
6

Sistem kendali sumber apa yang Anda gunakan?

Hampir semuanya memiliki beberapa bentuk $ Id $ tag yang diperluas ketika file di check in.

Saya biasanya menggunakan beberapa bentuk peretasan untuk menampilkan ini sebagai nomor versi.

Alternatif lain adalah menggunakan tanggal sebagai nomor build: 080803-1448

engtech
sumber
Dapatkah Anda memperluas "Hampir semuanya memiliki beberapa bentuk $ Id $ tag yang diperluas ketika file di check in". Secara khusus, apakah Anda tahu tentang subversi?
Greg B
3

[Visual Studio 2017, .csproj properti ]

Untuk memperbarui properti PackageVersion / Version / AssemblyVersion Anda (atau properti lainnya) secara otomatis, pertama, buat Microsoft.Build.Utilities.Taskkelas baru yang akan mendapatkan nomor build Anda saat ini dan kirim kembali nomor yang diperbarui (saya sarankan untuk membuat proyek terpisah hanya untuk kelas itu).

Saya memperbarui nomor mayor.minor secara manual, tetapi biarkan MSBuild memperbarui nomor build secara otomatis (1.1. 1 , 1.1. 2 , 1.1. 3 , dll. :)

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

}

Kemudian panggil Tugas yang baru saja Anda buat di proses MSBuild menambahkan kode berikutnya pada file .csproj Anda:

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

Saat memilih opsi proyek Visual Studio Pack (ubah saja menjadi BeforeTargets="Build"untuk menjalankan tugas sebelum Build) kode RefreshVersion akan dipicu untuk menghitung nomor versi baru, danXmlPoke tugas akan memperbarui properti .csproj Anda sesuai (ya, itu akan mengubah file).

Saat bekerja dengan pustaka NuGet, saya juga mengirim paket ke repositori NuGet dengan hanya menambahkan tugas build berikutnya ke contoh sebelumnya.

<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\nugetadalah tempat saya memiliki klien NuGet (ingatlah untuk menyimpan kunci API NuGet Anda dengan menelepon nuget SetApiKey <my-api-key>atau memasukkan kunci tersebut pada panggilan push NuGet).

Untuk berjaga-jaga jika itu membantu seseorang ^ _ ^.

Nacho Coll
sumber
1

Beberapa waktu lalu saya menulis exe cepat dan kotor yang akan memperbarui versi # di assemblyinfo. {Cs / vb} - Saya juga telah menggunakan rxfind.exe (alat pengganti pencarian berbasis regex yang sederhana dan kuat) untuk melakukan perbarui dari baris perintah sebagai bagian dari proses pembuatan. Beberapa petunjuk bermanfaat lainnya:

  1. pisahkan assemblyinfo menjadi beberapa bagian produk (nama perusahaan, versi, dll.) dan bagian khusus perakitan (nama perakitan, dll.). Lihat disini
  2. Juga - saya menggunakan subversi, jadi saya merasa terbantu untuk menetapkan nomor build ke nomor revisi subversi sehingga membuatnya sangat mudah untuk selalu kembali ke basis kode yang menghasilkan perakitan (misalnya 1.4.100.1502 dibangun dari revisi 1502).
caryden
sumber
Jika itu untuk file kode ( .cs / .vb), Anda harus menggunakan template T4.
BrainSlugs83
0

Jika Anda menginginkan nomor auto incrementing yang diperbarui setiap kali kompilasi selesai, Anda dapat menggunakan VersionUpdater dari acara pra-pembuatan. Peristiwa pra-build Anda dapat memeriksa konfigurasi build jika Anda menginginkannya sehingga nomor versi hanya akan bertambah untuk build Rilis (misalnya).

pengguna283258
sumber
Menarik. Saya sudah memiliki nama saya sendiri selama bertahun-tahun dengan nama yang sama dan tidak tahu bahwa ada (meskipun saya baru saja menaruhnya online baru-baru ini): github.com/rjamesnw/VersionUpdater
James Wilkins