Versi adalah sesuatu yang saya sangat sukai dan telah menghabiskan waktu lama mencoba untuk datang dengan sistem versi yang mudah digunakan. Dari apa yang telah Anda katakan dalam pertanyaan Anda, jelas bahwa Anda telah memahami satu poin penting, nomor versi perakitan tidak sama dengan versi produk. Yang satu digerakkan secara teknis, dan yang lain digerakkan oleh bisnis.
Berikut ini mengasumsikan bahwa Anda menggunakan beberapa bentuk kontrol sumber dan server build. Untuk konteks kami menggunakan TeamCity dan Subversion / Git. TeamCity gratis untuk sejumlah kecil (10) proyek dan membangun server yang sangat baik tetapi ada yang lain, beberapa di antaranya benar-benar gratis.
Apa arti nomor versi
Apa arti suatu versi bagi satu orang dapat berarti sesuatu yang berbeda dari yang lain, struktur umumnya adalah utama, minor, makro, mikro. Cara saya melihat nomor versi adalah memecahnya menjadi dua bagian. Babak pertama menjelaskan versi utama (Mayor) dan setiap pembaruan utama (Minor). Babak kedua menunjukkan kapan itu dibangun dan apa versi kode sumber itu. Nomor versi juga memiliki arti berbeda tergantung pada konteksnya, apakah itu API, Aplikasi Web, dll.
Major
. Minor
. Build
.Revision
Revision
Ini adalah angka yang diambil dari kontrol sumber untuk mengidentifikasi apa yang sebenarnya dibangun.
Build
Ini adalah angka yang terus meningkat yang dapat digunakan untuk menemukan build tertentu di server build. Ini adalah angka penting karena server build mungkin telah membangun sumber yang sama dua kali dengan serangkaian parameter yang berbeda. Menggunakan nomor build bersama dengan nomor sumber memungkinkan Anda untuk mengidentifikasi apa yang dibangun dan bagaimana.
Minor
Ini hanya akan berubah ketika ada perubahan signifikan ke antarmuka publik. Misalnya, jika itu adalah API, apakah kode yang dikonsumsi masih dapat dikompilasi? Nomor ini harus diatur ulang ke nol ketika nomor Mayor berubah.
Major
menunjukkan versi produk yang Anda gunakan. Misalnya, Mayor dari semua majelis VisualStudio 2008 adalah 9 dan VisualStudio 2010 adalah 10.
Pengecualian terhadap aturan
Selalu ada pengecualian untuk aturan dan Anda harus beradaptasi ketika Anda menemukan mereka. Pendekatan asli saya didasarkan pada penggunaan subversi tetapi baru-baru ini saya telah pindah ke Git. Kontrol sumber seperti subversi dan sumber yang aman yang menggunakan repositori pusat memiliki nomor yang dapat digunakan untuk mengidentifikasi serangkaian sumber tertentu dari waktu tertentu. Ini bukan kasus untuk kontrol sumber terdistribusi seperti Git. Karena Git menggunakan repositori terdistribusi yang ada di setiap mesin pengembangan tidak ada nomor penambahan otomatis yang dapat Anda gunakan, ada peretasan yang menggunakan jumlah check-in tetapi jelek. Karena ini saya harus mengembangkan pendekatan saya.
Major
. Minor
. Macro
.Build
Nomor revisi sekarang telah hilang, build telah bergeser ke tempat revisi sebelumnya dan Makro telah dimasukkan. Anda dapat menggunakan makro sesuai keinginan Anda tetapi sebagian besar waktu saya biarkan sendiri. Karena kami menggunakan TeamCity informasi yang hilang dari angka revisi dapat ditemukan di build, itu berarti ada proses dua langkah tetapi kami tidak kehilangan apa pun dan kompromi yang dapat diterima.
Apa yang harus diatur
Hal pertama yang harus dipahami adalah bahwa Versi Perakitan, Versi File dan Versi Produk tidak harus cocok. Saya tidak menganjurkan memiliki set angka yang berbeda tetapi itu membuat hidup jauh lebih mudah ketika membuat perubahan kecil pada sebuah majelis yang tidak mempengaruhi antarmuka publik yang Anda tidak dipaksa untuk mengkompilasi ulang majelis yang bergantung. Cara saya menangani ini adalah dengan hanya mengatur angka-angka Mayor dan Minor dalam Versi Majelis tetapi untuk mengatur semua nilai dalam Versi File. Sebagai contoh:
- 1.2.0.0 (AssemblyVersion)
- 1.2.3.4 (FileVersion)
Ini memberi Anda kemampuan untuk meluncurkan perbaikan panas yang tidak akan merusak kode yang ada karena versi perakitan tidak cocok tetapi memungkinkan Anda untuk melihat revisi / membangun majelis dengan melihat nomor versi file. Ini adalah pendekatan umum dan dapat dilihat pada beberapa majelis sumber terbuka ketika Anda melihat detail perakitan.
Anda sebagai ketua Tim harus bertanggung jawab untuk menambah nomor minor ketika suatu perubahan yang diperlukan diperlukan. Salah satu solusi untuk meluncurkan perubahan yang diperlukan untuk antarmuka tetapi tidak melanggar kode sebelumnya adalah dengan menandai yang saat ini usang dan membuat antarmuka baru. Ini berarti bahwa kode yang ada diperingatkan bahwa metode ini sudah usang dan dapat dihapus kapan saja tetapi tidak mengharuskan Anda untuk segera merusak semuanya. Anda kemudian dapat menghapus metode usang ketika semuanya telah dimigrasi.
Cara menghubungkannya bersama
Anda dapat melakukan semua hal di atas secara manual tetapi akan sangat memakan waktu, berikut ini adalah cara kami mengotomatiskan prosesnya. Setiap langkah bisa dijalankan.
- Hapus
AssemblyVersion
dan AssemblyFileVersion
atribut dari semua file AssemblyInfo.cs proyek.
- Buat file info rakitan umum (sebut saja VersionInfo.cs) dan tambahkan sebagai item tertaut ke semua proyek Anda.
- Tambahkan
AssemblyVersion
dan AssemblyFileVersion
atribut ke versi dengan nilai "0.0.0.0".
- Buat proyek MsBuild yang membangun file solusi Anda.
- Tambahkan tugas sebelum build yang memperbarui VersionInfo.cs. Ada sejumlah perpustakaan MsBuild sumber terbuka yang menyertakan tugas AssemblyInfo yang dapat mengatur nomor versi. Cukup setel ke angka dan uji sewenang-wenang.
- Tambahkan grup properti yang berisi properti untuk setiap segmen nomor build. Di sinilah Anda mengatur mayor dan minor. Nomor build dan revisi harus diberikan sebagai argumen.
Dengan subversi:
<PropertyGroup>
<Version-Major>0</Version-Major>
<Version-Minor>0</Version-Minor>
<Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
<Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
<Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
<Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>
Semoga saya jelas tapi ada banyak yang terlibat. Silakan ajukan pertanyaan. Saya akan menggunakan umpan balik apa pun untuk menyatukan posting blog yang lebih ringkas.