Saya telah menghabiskan sebagian besar dari beberapa jam mencoba menemukan cara untuk versi penambahan otomatis di .NETCoreApp 1.1 (Visual Studio 2017).
Saya tahu AssemblyInfo.cs sedang dibuat secara dinamis di dalam folder: obj/Debug/netcoreapp1.1/
Itu tidak menerima metode lama:
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]
Jika saya mengatur proyek ke paket, saya dapat mengatur versi di sana tetapi ini tampaknya digunakan untuk membangun file AssemblyInfo.cs.
Pertanyaan saya adalah, apakah ada yang tahu cara mengontrol versi di proyek .NET Core (atau .NETStandard dalam hal ini).
/p:
bendera kedotnet msbuild
dalam skrip build Anda dan menyetel versi, perusahaan, hak cipta ... semua hal bagus itu.<Deterministic>False</Deterministic>
di csproj untuk menggunakannya. (atau gunakan logika MSbuild lainnya untuk menghitung<VersionPrefix>
/<Version>
)Jawaban:
Saya telah mencari incrementer versi untuk aplikasi Net Core di VS2017 menggunakan format konfigurasi csproj.
Saya menemukan proyek bernama dotnet bump yang berfungsi untuk format project.json tetapi kesulitan menemukan solusi untuk format .csproj. Penulis benjolan dotnet sebenarnya datang dengan solusi untuk format .csproj dan itu disebut MSBump.
Ada proyek di GitHub untuk itu di:
https://github.com/BalassaMarton/MSBump
dimana Anda dapat melihat kode dan juga tersedia di Nuget. Cari saja MSBump di Nuget.
sumber
Tambahkan
<Deterministic>False</Deterministic>
di dalam<PropertyGroup>
bagian .csprojSolusi untuk membuat AssemblyVersion * berfungsi dijelaskan di "Pesan kesalahan membingungkan untuk wildcard di [AssemblyVersion] di .Net Core # 22660"
Alasan mengapa .Net Core Developers menganggap Deterministic Build bermanfaat seperti yang dijelaskan di http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html dan Compiler harus deterministik: input yang sama menghasilkan output yang sama # 372
Namun jika Anda menggunakan TeamCity, TFS atau alat CI / CD lainnya, mungkin lebih baik untuk tetap mengontrol nomor versi dan menambahkannya dan meneruskan ke build sebagai parameter (seperti yang disarankan dalam jawaban lain), misalnya
Nomor paket untuk paket NuGet
sumber
Jika Anda menggunakan Visual Studio Team Services / TFS atau beberapa proses pembuatan CI lainnya untuk memiliki versi built-in, Anda dapat menggunakan
Condition
atribut msbuild , misalnya:Ini akan memberi tahu compiler .NET Core untuk menggunakan apa pun yang ada di
BUILD_BUILDNUMBER
variabel lingkungan jika ada, atau kembali ke0.0.1-local
jika Anda melakukan build di mesin lokal Anda.sumber
Saya datang dengan solusi yang bekerja hampir sama dengan atribut AssemblyVersion lama dengan bintang (*) - AssemblyVersion ("1.0. ") *
Nilai untuk AssemblyVersion dan AssemblyFileVersion ada di file .csproj proyek MSBuild (bukan di AssemblyInfo.cs ) sebagai properti FileVersion (menghasilkan AssemblyFileVersionAttribute ) dan AssemblyVersion (menghasilkan AssemblyVersionAttribute ). Dalam proses MSBuild kami menggunakan tugas MSBuild kustom kami untuk menghasilkan nomor versi dan kemudian kami mengganti nilai properti FileVersion dan AssemblyVersion ini dengan nilai baru dari tugas.
Jadi pertama-tama kami membuat tugas MSBuild kustom kami GetCurrentBuildVersion :
Tugas kelas mewarisi dari Microsoft.Build.Utilities.Task kelas dari Microsoft.Build.Utilities.Core paket nuget. Dibutuhkan properti BaseVersion (opsional) pada input dan mengembalikan versi yang dihasilkan dalam properti keluaran Versi. Logika untuk mendapatkan nomor versi sama dengan pembuatan versi otomatis .NET (Nomor build adalah hitungan hari sejak 1/1/2000 dan Revisi setengah detik sejak tengah malam).
Untuk membangun tugas MSBuild ini, kami menggunakan jenis proyek perpustakaan kelas .NET Standard 1.3 dengan kelas ini.
File .csproj bisa terlihat seperti ini:
Proyek tugas ini juga tersedia di GitHub holajan / DC.Build.Tasks saya
Sekarang kita mengatur MSBuild untuk menggunakan tugas ini dan mengatur properti FileVersion dan AssemblyVersion . Dalam file .csproj terlihat seperti ini:
Hal-hal penting di sini:
Keuntungan dari solusi ini adalah ia berfungsi tidak hanya dari build di server build, tetapi juga dalam build manual dari build dotnet atau Visual Studio.
sumber
DateTime.UtcNow
alih-alihDateTime.Now
dalam metodeGetCurrentBuildVersionString()
khususnya jika kode dijalankan pada mesin pembuat otomatis. Mereka mungkin berjalan pada jam 2 pagi atau 3 pagi saat komputer Anda beralih ke / dari waktu musim panas. DenganDateTime.Now
skenario itu Anda mungkin akan mundur dalam hal versi. Memang, ini adalah kasus sudut dan saya juga mengakui bahwa saya pilih-pilih. :-) Selain itu, masalahnya juga akan hilang jika Anda mengonfigurasi zona waktu yang sama di semua mesin build dan tidak menyesuaikan dengan waktu musim panas.Anda dapat menggunakan fungsi properti MSBuild untuk menyetel akhiran versi berdasarkan tanggal saat ini:
Ini akan menampilkan paket dengan nama seperti: PackageName.1.0.0-pre20180807-1711.nupkg .
Rincian lebih lanjut tentang fungsi properti MSBuild: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions
The
Version
terbentuk dari kombinasiVersionPrefix
danVersionSuffix
, atau jikaVersionSuffix
kosong,VersionPrefix
hanya.sumber
Saya menerima jawaban di atas karena @Gigi benar (seperti yang sekarang) tetapi saya kesal dan muncul dengan Skrip PowerShell berikut.
Pertama saya memiliki skrip di folder solusi saya (UpdateBuildVersion.ps1):
Saya menambahkan ini ke file csproj:
Bahkan melalui setnya menjadi PreBuildEvent, faktanya adalah nomor versi tidak diperbarui sampai SETELAH file telah dimuat ke memori sehingga nomor versi tidak akan mencerminkan sampai pembuatan berikutnya. Faktanya, Anda dapat mengubahnya menjadi PostBuildEvent dan itu akan memiliki efek yang sama.
Saya juga membuat dua skrip berikut: (UpdateMinorVersion.ps1)
(UpdateMajorVersion.ps1)
sumber
dotnet build /p:AssemblyVersion=1.2.3.4
Saya menanggapi: "apakah ada yang tahu cara mengontrol versi dalam proyek .NET Core (atau .NETStandard dalam hal ini)." Saya menemukan pertanyaan ini mencoba memecahkan masalah ini dalam konteks build CI. Saya ingin mengatur versi perakitan ke nomor build CI.
sumber
Nilai-nilai ini sekarang ditetapkan di
.csproj
file:Ini adalah nilai yang sama yang Anda lihat jika Anda masuk ke tab Paket di pengaturan proyek. Meskipun menurut saya Anda tidak dapat menggunakan
*
untuk meningkatkan versi secara otomatis, yang dapat Anda lakukan adalah memperkenalkan langkah pasca-pemrosesan yang menggantikan versi untuk Anda (misalnya sebagai bagian dari integrasi berkelanjutan Anda).sumber
Saya membuat alat CLI sederhana untuk mengatur string versi .csproj .NET Core di sini . Anda dapat menggabungkannya dengan alat seperti GitVersion untuk peningkatan versi otomatis selama pembuatan CI, jika itu yang Anda cari.
sumber
Untuk mengaktifkan pembuatan versi .Net Core / .Net Proyek apa pun berdasarkan penyiapan GIT Anda, gunakan fungsi tag / deskripsikan GIT.
Saya telah menggunakan file Prebuild.t target.xml yang terletak di folder root untuk proyek dan termasuk dalam file csproj seperti:
Gunakan tag "GenerateAssembyInfo" untuk menonaktifkan pembuatan info perakitan otomatis.
Kemudian Prebuild.target.xml akan menghasilkan file CommonAssemblyInfo.cs di mana Anda dapat memasukkan tag versi yang Anda inginkan berdasarkan versi GIT Anda
CATATAN: Saya telah menemukan Prebuilds.t target.xml di tempat lain, jadi belum repot-repot membersihkannya.)
File Prebuild.t target.xml:
EDIT: Jika Anda membangun menggunakan MSBUILD
Mungkin membuatmu kesulitan, gunakan
sebagai gantinya
sumber
Anda dapat melakukan hal di bawah ini, di dalam file csproj. Saya tidak mengerti matematika. Saya menemukan itu di tempat lain di stackoverflow. Tapi ini berfungsi dan akan memberi Anda sesuatu yang mirip dengan 1.0. * Untuk versi.
sumber
Ekstensi Versi Otomatis untuk Visual Studio sekarang mendukung .Net Core dan .Net Standard autoincrementing dalam antarmuka pengguna yang sederhana.
https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions
sumber
Terima kasih kepada @joelsand karena telah mengarahkan saya ke arah yang benar.
Saya harus mengubah jawabannya sedikit karena ketika DevOps Build dijalankan, saya mendapat pengecualian berikut
Saya harus menambahkan $ (BUILD_BUILDNUMBER) di akhir bagian major.minor.build. Untuk menghapus duplikat versi sebenarnya, saya juga menggunakan awalan versi:
sumber
Kita dapat menggunakan parameter khusus untuk
dotnet publish -- version-suffix 1.2.3
Untuk versi file:
Untuk versi:
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21
sumber
Saya rasa Jawaban dari @joelsand ini adalah jawaban yang benar untuk mengatur nomor versi untuk inti dotnet yang berjalan di VSTS
Untuk menambahkan lebih banyak informasi untuk jawaban ini,
BUILD_BUILDNUMBER
sebenarnya adalah variabel yang telah ditentukan sebelumnya .Ternyata ada 2 versi variabel standar.
Salah satunya adalah build.xxxx, yang lainnya adalah BUILD_XXXX.
Anda hanya dapat menggunakan
Environment Variable Name
di cproj.sumber
build.xxxx
digunakan di front end untuk mereferensikan dalam pipeline danBUILD_XXXX
memiliki nilai yang sama tetapi dengan sintaks yang sedikit dimodifikasi diperlukan untuk mereferensikan variabel di PS?