Bisakah saya secara otomatis meningkatkan versi pembuatan file saat menggunakan Visual Studio?

358

Saya hanya ingin tahu bagaimana saya bisa secara otomatis meningkatkan build (dan versi?) File saya menggunakan Visual Studio (2005).

Jika saya mencari properti say C:\Windows\notepad.exe, tab Version memberi "Versi file: 5.1.2600.2180". Saya ingin mendapatkan angka-angka keren ini dalam versi dll saya juga, bukan versi 1.0.0.0, yang mari kita hadapi itu agak membosankan.

Saya mencoba beberapa hal, tetapi sepertinya itu bukan fungsi out-of-box, atau mungkin saya hanya mencari di tempat yang salah (seperti biasa).

Saya bekerja dengan sebagian besar proyek web ....

Saya melihat keduanya:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

dan saya tidak bisa percaya begitu banyak upaya untuk melakukan sesuatu adalah praktik standar.

EDIT: Tidak berfungsi di VS2005 sejauh yang saya tahu ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )

meskipun
sumber
1
wild card sepertinya hanya berfungsi untuk AssemblyVersion tetapi tidak untuk AssemblyFileVersion di VS 2005
dotnetcoder
Apakah ada solusi untuk ini yang berfungsi untuk proyek C ++ di VS2005? Semua jawaban tampaknya rerlate ke .Net. Pertanyaan terkait . Terima kasih
Deanna
Dalam proyek .Net Core increment auto-increment AssemblyVersion tidak berfungsi secara default. Anda perlu menambahkan <Deterministic> False </Deterministic> ke csproj. Lihat Versi Otomatis di Visual Studio 2017 (.NET Core)
Michael Freidgeim

Jawaban:

434

Dalam visual Studio 2008, berikut ini berfungsi.

Temukan file AssemblyInfo.cs dan temukan 2 baris ini:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Anda dapat mencoba mengubahnya ke:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

Tetapi ini tidak akan memberi Anda hasil yang diinginkan, Anda akan berakhir dengan Versi Produk 1.0. * Dan Versi File 1.0.0.0 . Bukan yang kamu inginkan!

Namun, jika Anda menghapus baris kedua dan hanya memiliki:

[assembly: AssemblyVersion("1.0.*")]

Kemudian kompiler akan mengatur Versi File untuk menjadi sama dengan Versi Produk dan Anda akan mendapatkan hasil yang Anda inginkan dari produk peningkatan otomatis dan versi file yang disinkronkan. Misalnya 1.0.3266.92689

Sam Meldrum
sumber
2
Ini bekerja sebaik yang lainnya, dan bekerja di VS2005. Saya berharap untuk beberapa bilangan rasional seperti 1.0.1.56 sebagai pengganti saya mendapatkan 1.0.3266.30135 tapi setidaknya itu meningkat (walaupun dengan beberapa nomor acak: D)
walaupun
14
oh saya baru saja membacanya: itu akan secara otomatis mengisi dua angka terakhir dengan tanggal (dalam beberapa hari dari beberapa titik) dan waktu (setengah detik dari tengah malam)
meskipun
20
Panggilan bagus untuk menghapus atribut AssemblyFileVersion agar ini berfungsi!
David Faivre
76
Saya menyadari ini adalah pertanyaan lama, tetapi ingin menambahkan komentar ini untuk orang lain yang menemukan jalan mereka ke jawaban ini. Jika Anda menambah AssemblyVersion, proyek apa pun yang menggunakan dll Anda perlu dikompilasi ulang. Namun, jika Anda menjaga AssemblyVersion tetap sama dan menambah AssemblyFileVersion dengan sendirinya, maka Anda dapat menukar dll yang baru tanpa harus mengkompilasi ulang apa pun yang menggunakannya. Jadi tanyakan pada diri sendiri ini, apakah ini hanya bangunan baru, atau apakah saya merilis versi baru?
onefootswill
27
@ DD59 the 'Build' adalah jumlah hari sejak 1 Januari 2000; 'Revisi' adalah detik dari tengah malam dibagi 2 (bukan setengah detik, tetapi interval dua detik). Lihat di sini: stackoverflow.com/a/3387167/11545
Cristian Diaconescu
154

buka file AssemblyInfo.cs dan ubah

// 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")]

untuk

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

Anda dapat melakukan ini dalam IDE dengan pergi ke project -> properties -> assembly information

Namun ini hanya akan memungkinkan Anda untuk secara otomatis menambah versi Majelis dan akan memberi Anda

Versi File Perakitan: wildcard ("*") tidak diizinkan di bidang ini

kotak pesan jika Anda mencoba menempatkan * di bidang versi file.

Jadi buka saja assemblyinfo.cs dan lakukan secara manual.

Telah
sumber
Ya, saya baru saja menemukan "" Versi File Perakitan: A wildcard ("*") tidak diperbolehkan di bidang ini "itulah yang memenangkan metode Anda centang hijau: D
inspite
3
ini berfungsi: [assembly: AssemblyVersion ("1.0. *")] // [assembly: AssemblyFileVersion ("1.0.0.0")]
walaupun
4
Tidak diinginkan untuk mengubah nomor AssemblyVersion selama siklus rilis. Sebaliknya, AssemblyFileVersion harus diubah. Lihat posting blog saya tentang topik ini: philippetruche.wordpress.com/2008/08/12/... Lihat juga postingan Suzanne Cook mengenai kapan harus mengubah angka: blogs.msdn.com/b/suzcook/archive/2003/05/ 29 / 57148.aspx
Philippe
46
Saya akan berhati-hati menggunakan * itu akan berhenti bekerja pada 4 Juni 2179 ketika hari menjadi 65536
Lloyd Powell
3
@Shimmy: Tambahkan <Deterministic> Salah </Deterministic> ke .csproj Versi Otomatis di Visual Studio 2017 (.NET Core)
Michael Freidgeim
53

Opsi lain untuk mengubah nomor versi di setiap build adalah menggunakan tugas Versi dari MSBuild.Community.Tasks . Cukup unduh penginstalnya, instal, lalu sesuaikan kode berikut dan tempel setelah <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />di .csprojfile Anda :

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

Catatan: Adaptasi properti StartDate ke lokal Anda. Saat ini tidak menggunakan budaya invarian.

Untuk bangunan ketiga pada 14 Januari 2010, ini dibuat VersionInfo.csdengan konten ini:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

File ini kemudian harus ditambahkan ke proyek (melalui Tambahkan item yang ada ), AssemblyVersiondan AssemblyFileVersiongaris dan harus dihapus dari AssemblyInfo.cs.

Algoritma yang berbeda untuk mengubah komponen versi dijelaskan dalam $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmdan Properties Versi .

Kristen
sumber
2
Ini adalah cara terbaik yang pernah saya lihat untuk mengatasi fakta mengerikan bahwa struct FileVersion menggunakan bilangan bulat 16 bit.
Mike Post
1
Saya punya masalah menginstal ke VS2012 menggunakan Paket Konsol jadi rekomendasikan menggunakan installer msi malam yang diunduh di github.com/loresoft/msbuildtasks/downloads . Bekerja menyalin / menempel dari atas. Terima kasih!
DaveO
Setelah ditolak dan edit pada posting ini: "Anda mungkin juga ingin memeriksa loresoft.com/projects/msbuildtasks/... ini dapat meningkatkan fungsionalitas dasar yang dijelaskan sebelumnya."
radu florescu
1
Ini bukan solusi yang layak bagi mereka yang membangun dengan TFS. Ultimatey, ini akan menambahkan edit yang tertunda ke file VersionInfo.cs dan version.txt. Bagi saya, tidak perlu memiliki suntingan yang tertunda untuk setiap build.
JDennis
@JDennis lihat di sini untuk tips versi TFS ...
Christian
25

Saya datang dengan solusi yang mirip dengan orang Kristen tetapi tanpa tergantung pada tugas Komunitas MSBuild, ini bukan pilihan bagi saya karena saya tidak ingin menginstal tugas-tugas ini untuk semua pengembang kami.

Saya menghasilkan kode dan mengkompilasi ke Majelis dan ingin menambah nomor versi secara otomatis. Namun, saya tidak dapat menggunakan VS 6.0. * Trik AssemblyVersion karena peningkatan otomatis membuat angka setiap hari dan merusak kompatibilitas dengan Assemblies yang menggunakan nomor build yang lebih lama. Sebagai gantinya, saya ingin memiliki AssemblyVersion yang dikodekan dengan keras tetapi AssemblyFileVersion yang bertambah secara otomatis. Saya telah menyelesaikan ini dengan menentukan AssemblyVersion di AssemblyInfo.cs dan menghasilkan VersionInfo.cs di MSBuild seperti ini,

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

Ini akan menghasilkan file VersionInfo.cs dengan atribut Assembly untuk AssemblyFileVersion di mana versi mengikuti skema YY.MM.DD.TTTT dengan tanggal pembuatan. Anda harus memasukkan file ini dalam proyek Anda dan membangunnya.

Boog
sumber
Apakah MSBuild mendukung variabel? Akan lebih baik untuk dimasukkan [System.DateTime]::Nowke dalam satu, jika tidak, ada kondisi balapan yang dapat menyebabkan nomor build lama digunakan jika membangun dekat tengah malam.
Edward Brey
Apakah Anda mendefinisikan empat properti ini daripada menggabungkannya dalam satu DateTime.ToStringuntuk tujuan demonstratif, atau apakah ada alasan tertentu?
mafu
Jika acara BeforeBuild Anda tidak aktif di VS2017, periksa stackoverflow.com/questions/43921992/…
Rhys Jones
Solusi ini paling cocok untuk semua jawaban di sini. Namun, masalahnya adalah, stempel waktu (atau konten file versioninfo.cs) tidak diperbarui jika Anda membangun proyek untuk kedua kalinya yang akan menghasilkan menit yang berbeda. Jika saya menutup dan memuat ulang proyek, maka stempel waktu akan diperbarui. Apakah ini bug dari MSBuild? @ Boog
Cary
12

Untuk mendapatkan nomor versi coba

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

Untuk mengatur nomor versi, buat / edit AssemblyInfo.cs

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

Juga sebagai catatan tambahan, angka ketiga adalah jumlah hari sejak 2/1/2000 dan angka keempat adalah setengah dari jumlah total detik dalam sehari. Jadi jika Anda mengkompilasi di tengah malam itu harus nol.

Bob
sumber
12

Ada versi otomatis Visual Studio ekstensi yang mendukung Visual Studio (2012, 2013, 2015) 2017 & 2019.

Tangkapan Layar masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Rahul
sumber
Jadi saya telah mencopotnya dan saya bisa mengatakan lebih ... itu memodifikasi file csproj asli. Saya pikir itu ekstensi yang sangat bermasalah.
Maxim
2
@ Maxim Coba versi terbaru, itu akan bekerja pada VS 2017
Rady
Utilitas yang sangat baik. Bekerja dengan baik untuk saya di vs2017. Documents bisa sedikit lebih jelas, tetapi instal (melalui situs) dan kemudian instal MSBuild via Nuget, terapkan pada proyek kecil dan mainkan dan bangun. Bagus. Jawaban @ Boog tidak bekerja untuk saya walaupun dia mengatakan dengan tepat apa yang ingin saya capai.
err1
8

Mengatur a * dalam nomor versi di AssemblyInfo atau di bawah properti proyek seperti yang dijelaskan dalam posting lain tidak berfungsi dengan semua versi Visual Studio / .NET.

Afaik tidak bekerja di VS 2005 (tetapi dalam VS 2003 dan VS 2008). Untuk VS 2005 Anda bisa menggunakan yang berikut ini: Auto Increment Visual Studio 2005 versi membangun dan merevisi nomor pada waktu kompilasi .

Namun ketahuilah bahwa mengubah nomor versi secara otomatis tidak disarankan untuk majelis yang diberi nama kuat. Alasannya adalah bahwa semua referensi untuk perakitan seperti itu harus diperbarui setiap kali perakitan yang direferensikan dibangun kembali karena fakta bahwa referensi perakitan yang bernama kuat selalu merupakan referensi ke versi perakitan tertentu. Microsoft sendiri mengubah nomor versi rakitan .NET Framework hanya jika ada perubahan antarmuka. (NB: Saya masih mencari tautan di MSDN tempat saya membacanya.)

Dirk Vollmar
sumber
Saya pikir untuk setiap versi VS Anda hanya dapat meletakkan * di kotak Build atau Revisi. Saya baru saja mencoba ini menggunakan VS 2005, dan berfungsi dengan baik. Saya tidak yakin apa yang dibicarakan oleh penulis artikel proyek kode itu.
MusiGenesis
Mungkin itu kembali dengan paket layanan, tetapi saya ingat bahwa itu tidak digunakan untuk bekerja ketika saya menggunakan VS 2005.
Dirk Vollmar
Tidak berfungsi dengan 2005, saya akan mencari paket layanan dan melaporkan kembali.
meskipun
Mungkin MusiGenesis memiliki add-on yang terpasang yang memungkinkan versi otomatis.
Dirk Vollmar
@divo: tidak, saya add-on-fobia. Saya hanya punya Visual Studio 2005 Professional SP1. Saya belum pernah melihat masalah dengan *, tapi saya biasanya bertambah secara manual. Kedengarannya seperti bug aneh.
MusiGenesis
6

Untuk mendapatkan informasi incrementing (DateTime) ke properti AssemblyFileVersion yang memiliki keuntungan tidak melanggar dependensi.


Membangun solusi Boog (tidak berfungsi untuk saya, mungkin karena VS2008?), Anda dapat menggunakan kombinasi acara pra-bangun yang menghasilkan file, menambahkan file itu (termasuk properti versinya) dan kemudian menggunakan cara untuk membacakan nilai-nilai itu lagi. Itu adalah..

Pra-Bangun-Acara:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

Sertakan file VersionInfo.cs yang dihasilkan (Properties subfolder) ke dalam proyek Anda

Kode untuk mendapatkan Tanggal kembali (tahun ke detik):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

Tidak terlalu nyaman .. juga, saya tidak tahu apakah itu menciptakan banyak force-rebuilds (karena file selalu berubah).

Anda bisa membuatnya lebih pintar misalnya jika Anda hanya memperbarui file VersionInfo.cs setiap beberapa menit / jam (dengan menggunakan file sementara dan kemudian menyalin / menimpa VersionInfo.cs nyata jika perubahan yang cukup besar terdeteksi). Saya melakukan ini sekali dengan cukup sukses.

Andreas Reiff
sumber
Ini bekerja dengan sempurna. Namun, ekspresi reguler ini% tanggal: ~ -4,4%.% Tanggal: ~ -7,2 %% tanggal: ~ -10,2%.% Waktu: ~ 0,2 %% waktu: ~ 3,2% .% waktu: ~ -5,2% "terlalu rumit.
Cary
5

Atur nomor versi ke "1.0. *" Dan secara otomatis akan mengisi dua nomor terakhir dengan tanggal (dalam beberapa hari dari beberapa titik) dan waktu (setengah detik dari tengah malam)

James Curran
sumber
hei seandainya saya telah membaca ini dengan benar pada awalnya saya akan menyelamatkan diri saya sendiri terlalu banyak. thx
inspite
4

Cake mendukung penambalan file AssemblyInfo. Dengan kue di tangan Anda memiliki cara tak terbatas untuk menerapkan penambahan versi otomatis.

Contoh sederhana dari penambahan versi seperti kompiler C #:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

Sini:

  • Versi - adalah versi perakitan. Praktik terbaik adalah mengunci nomor versi utama dan meninggalkan sisa dengan nol (seperti "1.0.0.0").
  • FileVersion - adalah versi file perakitan.

Perhatikan bahwa Anda dapat menambal tidak hanya versi tetapi juga semua informasi lain yang diperlukan .

hal
sumber
3

Pergi ke Proyek | Properti dan kemudian Informasi Perakitan dan kemudian Versi Perakitan dan letakkan * di kotak terakhir atau kedua ke terakhir (Anda tidak dapat menambahkan komponen Utama atau Minor secara otomatis).

MusiGenesis
sumber
2

Gunakan tugas AssemblyInfo dari proyek MSBuild Community Tasks ( http://msbuildtasks.tigris.org/ ), dan mengintegrasikannya ke dalam file .csproj / .vbproj Anda.

Ini memiliki sejumlah opsi, termasuk satu untuk mengikat nomor versi dengan tanggal dan waktu hari.

Direkomendasikan.

menghancurkan
sumber
2

Sampai sekarang, untuk aplikasi saya,

string ver = Application.ProductVersion;

kembali ver = 1.0.3251.27860

Nilai 3251 adalah jumlah hari sejak 1/1/2000. Saya menggunakannya untuk meletakkan tanggal pembuatan versi di layar splash aplikasi saya. Saat berhadapan dengan seorang pengguna, saya dapat menanyakan tanggal pembuatan yang lebih mudah untuk dikomunikasikan daripada beberapa nomor lama.

(Saya deputi satu orang yang mendukung perusahaan kecil. Pendekatan ini mungkin tidak cocok untuk Anda.)

SeaDrive
sumber
Nomor Anda akan cepat habis. Saya akan menggunakan yyddd yang merupakan 2 digit tahun dan 3 digit hari dari awal tahun yang merupakan maksimal 365. setidaknya program Anda akan dikompilasi hingga tahun 2065. maka Anda akan pensiun dan biarkan orang lain mencari tahu bagaimana mereka ingin menanganinya. mengingat program Anda masih dalam komisi pada tanggal itu!
AaA
2

Mengubah AssemblyInfo berfungsi di VS2012. Tampaknya aneh bahwa tidak ada lagi dukungan untuk ini di Visual Studio, Anda akan berpikir ini adalah bagian dasar dari proses build / release.

Maxcelcat
sumber
2

Cara mendapatkan versinya {major}.{year}.1{date}.1{time}

Yang ini agak eksperimental, tapi saya suka. Terinspirasi oleh Jeff Atwood @ CodingHorror ( tautan ).

Nomor versi yang dihasilkan menjadi 1.2016.10709.11641(artinya 2016-07-09 16:41), yang memungkinkan untuk

  • orang miskin zero padding (dengan 1s bodoh memimpin )
  • DateTime lokal yang dapat dibaca dan disematkan ke nomor versi
  • meninggalkan versi mayor sendirian untuk perubahan yang sangat besar.

Menambahkan item baru untuk proyek Anda, pilih General -> Template Teks, nama itu sesuatu seperti CustomVersionNumberdan (jika ada) komentar keluar AssemblyVersiondan AssemblyFileVersiondi Properties/AssemblyInfo.cs.

Kemudian, ketika menyimpan file ini, atau membangun proyek, ini akan membuat kembali .csfile yang terletak sebagai sub-item di bawah .ttfile yang dibuat .

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

sumber
Anda tidak mengkompilasi program Anda setiap menit atau menggunakan lebih dari sekali sehari, jadi secara teknis bagian waktu tidak perlu menempati informasi yang berharga, saya akan menggunakan 1 dan 2 untuk minor utama dan dan hanya menggunakan nomor 3 untuk tanggal yyddd (dua digit tahun + hari ddd dari awal tahun yang sama) dan tinggalkan tanggal 4 untuk nomor build tambahan.
AaA
2

Saya telah membuat aplikasi untuk meningkatkan versi file secara otomatis.

  1. Unduh Aplikasi
  2. tambahkan baris berikut ke pre-build event command line

    C: \ temp \ IncrementFileVersion.exe $ (SolutionDir) \ Properties \ AssemblyInfo.cs

  3. Bangun proyek

Untuk membuatnya lebih sederhana, aplikasi ini hanya melempar pesan jika ada kesalahan, untuk mengonfirmasi itu berfungsi dengan baik, Anda perlu memeriksa versi file di 'Informasi Perakitan'

Catatan: Anda harus memuat ulang solusi di Visual studio untuk tombol 'Informasi Majelis' untuk mengisi bidang, namun file keluaran Anda akan memiliki versi yang diperbarui.

Untuk saran dan permintaan, silakan kirim email ke saya di [email protected]

Telson Alva
sumber
2

Dalam Visual Studio 2019

Itu tidak cukup bagi saya untuk menambahkan

[assembly: AssemblyVersion("1.0.*")]

Ketika membangun itu membuat saya kesalahan ini

String versi yang ditentukan tidak sesuai dengan format yang diperlukan

Larutan

Format ini akhirnya diterima setelah saya set Deterministicke Falsedalamproject.csproj

<Deterministic>false</Deterministic>

Edit:

Untuk beberapa alasan, pengaturan Deterministicuntuk Falsemengacaukan file konfigurasi saya memuatnya dan menyimpannya di lokasi yang berbeda.

Penanganan masalah:

Saya menyiapkan acara pasca-pembangunan untuk menambah nomor revisi:

Skrip kumpulan Acara Pasca Bangun

Ini menyebut skrip PowerShell yang dinamai autoincrement_version.ps1passing sebagai argumenAssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Skrip Poweshell

Itu otomatis meningkatkan nomor revisi menggunakan Regex

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
Madacol
sumber
1

Mungkin, untuk tugas ini, Anda dapat menggunakan kode seperti ini:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

dan menyebutnya dari pemuatan formulir.
Dengan kode ini Anda dapat memperbarui bagian mana pun dari info file di AssemblyInfo.cs (tetapi Anda harus menggunakan struktur direktori "standar").

Atiris
sumber
1

Saya menggunakan pendekatan ini https://stackoverflow.com/a/827209/3975786 dengan menempatkan templat T4 dalam "Item Solusi" dan menggunakannya dengan "Tambahkan sebagai Tautan" di dalam setiap proyek.

mcandal
sumber
1

Mungkin sudah terlambat untuk menjawab di sini tapi berharap itu akan menyelesaikan masalah kesibukan seseorang.

Cara otomatis untuk mengubah versi perakitan semua proyek Anda menggunakan skrip PowerShell. Artikel ini akan menyelesaikan banyak masalah Anda.

Khawaja Asim
sumber
Satu-satunya masalah dengan PS adalah lambat bereaksi dan memerlukan konfigurasi untuk menjalankannya. Saya akan pergi dengan executable kecil, file tt4 atau bahkan kode inline yang saya pikir setiap programmer dapat menulis dengan satu cara.
AaA
0

Setiap kali saya membangunnya, otomatis menambah angka yang paling tidak signifikan.

Saya tidak tahu cara memperbarui yang lain, tetapi Anda setidaknya harus sudah melihatnya ...

Brian Knoblauch
sumber
1
VS bertugas menambah angka terakhir yang biasanya nomor build. Segala sesuatu yang lain (yaitu angka-angka sebelum itu) terserah Anda karena mereka mewakili versi aplikasi Anda.
Огњен Шобајић
1
Огњен Шобајић: Tidak sepenuhnya benar. Skema penomoran Microsoft adalah major.minor.build.revision, misal 1.0.4.7. Jika Anda mengatur versi perakitan ke sesuatu seperti "1.0. *" Maka VS akan mengatur angka pembuatan dan revisi untuk Anda. Jika demikian, build akan bertambah setiap hari, dan revisi akan menjadi jumlah detik sejak tengah malam, dibagi dengan 2.
Simon Tewsi
0

Bagi siapa pun yang menggunakan Tortoise Subversion, Anda dapat mengikat salah satu nomor versi Anda ke nomor Revisi subversi kode sumber Anda. Saya menemukan ini sangat berguna (Auditor juga suka ini!). Anda melakukan ini dengan memanggil utilitas WCREV di pre-build Anda dan menghasilkan AssemblyInfo.cs Anda dari templat.

Jika template Anda disebut AssemblyInfo.wcrev dan duduk di direktori AssemblyInfo.cs normal, dan kura-kura ada di direktori instalasi default, maka perintah Pra-Bangun Anda terlihat seperti ini (NB Semua pada satu baris):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

File template akan menyertakan string substitusi wcrev token: $ WCREV $
eg

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

Catatan:
Karena AssemblyInfo.cs Anda sekarang dibuat, Anda tidak ingin itu dikontrol versi.

John Denniston
sumber