Apakah Semantic Versioning mengizinkan 4 komponen dalam nomor versi?

16

Semua contoh versi semantik yang pernah saya lihat menunjukkan 3 komponen yang digunakan. Tidak lebih dari 2 karakter periode. Di $DAYJOB, kami menggunakan 4 komponen dalam nomor rilis kami:

5.0.1.2

Apakah Semantic Versioning mengizinkan ini?

Dan sebagai pertanyaan sampingan level yang lebih tinggi dan lebih bisa diperdebatkan, apakah itu benar-benar penting? Saya mulai berpikir mungkin ide yang baik untuk menegakkan versi semantik, tetapi pada akhirnya entitas seperti PCI menimpanya.

Saya harus mengklarifikasi komentar PCI saya. Masalahnya adalah bahwa audit dan pengaruhnya terhadap biaya ketika komponen utama dan kecil berubah, belum tentu merupakan fitur baru yang sebenarnya. Misalnya, jika fitur terkait pembayaran diperkenalkan, kami menabrak nomor minor untuk PCI. Tetapi jika kita menambahkan fitur baru yang terkait dengan sesuatu di gui, itu tidak. Hanya tambalan yang berubah. Jadi dalam hal ini kita tidak benar-benar mengatakan dalam hal ini sebagai pengembang karena orang lain membuat keputusan itu.

void.pointer
sumber
Versi semantik adalah pedoman. Di mana PCI menyatakan sesuatu tentang bagaimana segala sesuatu harus diversi?
Saya harus mengklarifikasi komentar PCI saya. Masalahnya adalah bahwa audit dan pengaruhnya terhadap biaya ketika komponen utama dan kecil berubah, belum tentu merupakan fitur baru yang sebenarnya. Misalnya, jika fitur terkait pembayaran diperkenalkan, kami menabrak nomor minor untuk PCI. Tetapi jika kita menambahkan fitur baru yang terkait dengan sesuatu di gui, itu tidak. Hanya tambalan yang berubah. Jadi dalam hal ini kita tidak benar-benar mengatakan dalam hal ini sebagai pengembang karena orang lain membuat keputusan itu.
void.pointer
@ void.pointer dapatkah Anda memberikan contoh mengapa Anda menggunakan komponen keempat? Apakah Anda menggunakannya pada dasarnya memotong biaya internal dan struktur akuntansi - membiarkan tim Anda melacak fitur baru tanpa menabrak nomor tambalan?
enderland
@enderland Ya pada dasarnya. MAJOR(PCI).MINOR(PCI).FEATURE.HOTFIX+BUILD. Kami pada dasarnya hanya diizinkan untuk mengubah komponen ke-3 dan ke-4 tanpa melibatkan PCI (dan selanjutnya tuan PCI di perusahaan) yang terlibat. Bagi saya rasanya seperti ini sedikit dibuat-buat, saya tidak yakin mereka dibenarkan dalam cara mereka mengelola nomor versi, tetapi saya tidak cukup tahu tentang PCI dan proses audit untuk mengatakan sebaliknya.
void.pointer
4
Kami juga menggunakan 4 kelompok, dan bukan 3. Mengapa? Karena C ++. C ++ memiliki kompatibilitas mundur biner dan kompatibilitas mundur sumber : yang pertama menyiratkan yang terakhir, tetapi hubungannya tidak simetris. Dengan demikian, kami menggunakan grup ke-4 untuk kompatibilitas biner (Anda dapat melakukan hot-patch sistem) dan kelompok ke-3 untuk kompatibilitas sumber (Anda perlu melakukan kompilasi ulang, tetapi Anda tidak perlu memodifikasi kode Anda sendiri). Dan Anda tahu, itu bekerja untuk kita!
Matthieu M.

Jawaban:

21

Sepertinya Anda melewati konvensi normal hanya untuk menghindari proses overhead / audit. Itu ... menurut saya memprihatinkan.

Apa yang Anda lakukan adalah secara efektif membuat nomor versi tambahan (digit PCI kecil Anda) agak sengaja untuk memindahkan fitur / nomor versi minor Anda kembali ke suatu tempat, untuk tidak lagi memicu kriteria audit internal Anda.


Bagaimanapun, sampai ke pertanyaan Anda tentang versi semantik, spesifikasi untuk status Semantic Versioning :

Diberi nomor versi MAJOR.MINOR.PATCH, menambah:

  • Versi utama ketika Anda membuat perubahan API yang tidak kompatibel,
  • Versi MINOR saat Anda menambahkan fungsionalitas dengan cara yang kompatibel ke belakang, dan
  • Versi PATCH saat Anda membuat perbaikan bug yang kompatibel dengan mundur.
  • Label tambahan untuk pra-rilis dan metadata bangun tersedia sebagai ekstensi ke format MAJOR.MINOR.PATCH .

Tekankan milikku.

Jadi pertanyaannya adalah, apakah Anda menggunakan karakter keempat untuk metadata pra-rilis / bangun? Atau apakah ini pada dasarnya indikasi versi lain yang Anda rilis?

Jika "ya", maka spesifikasi versi semantik mengizinkannya. Jika "tidak" maka secara teknis Anda tidak mengikuti versi semantik.

Dan sebagai pertanyaan sampingan level yang lebih tinggi dan lebih bisa diperdebatkan, apakah itu benar-benar penting?

Apakah Anda ingin secara kaku mengikutinya atau tidak adalah keputusan yang harus Anda dan tim Anda buat. Tujuan pembuatan versi semantik adalah untuk membantu kompatibilitas API:

Perbaikan bug yang tidak memengaruhi penambahan API pada versi patch, penambahan / perubahan API yang kompatibel menambah versi minor, dan perubahan API yang tidak kompatibel yang mundur menambah versi utama.

Saya menyebut sistem ini "Versi Semantik." Di bawah skema ini, nomor versi dan cara perubahannya menyampaikan makna tentang kode yang mendasarinya dan apa yang telah dimodifikasi dari satu versi ke versi berikutnya.

Ini adalah sistem yang membantu membuatnya lebih jelas ketika versi memengaruhi pengguna hilir API.

Selama API Anda sama jelasnya, itu bukan masalah besar yang Anda pilih. Versi semantik secara langsung, misalnya jika saya menggunakan 3.4.2 dan perlu meningkatkan ke 3.4.10 Saya tahu saya bisa melakukannya tanpa merusak apa pun. Jika versi baru 3.5.1 saya tahu itu kompatibel ke belakang. Dan saya tahu versi 4.0.1 akan menjadi perubahan besar.

Itu semua adalah bagian dari apa yang dimaksud dengan nomor versi.

@enderland Ya pada dasarnya. MAJOR (PCI) .MINOR (PCI) .FATURE.HOTFIX + BUILD. Kami pada dasarnya hanya diizinkan untuk mengubah komponen ke-3 dan ke-4 tanpa melibatkan PCI (dan selanjutnya tuan PCI di perusahaan) yang terlibat. Bagi saya rasanya seperti ini sedikit dibuat-buat, saya tidak yakin mereka dibenarkan dalam cara mereka mengelola nomor versi, tetapi saya tidak cukup tahu tentang PCI dan proses audit untuk mengatakan sebaliknya.

Ok, ini baik-baik saja. Anda memiliki sistem yang berfungsi untuk Anda dan memenuhi kebutuhan Anda. Itulah gunanya versi.

Jika API Anda bersifat pribadi (hanya menghadap ke dalam), benar-benar tidak masalah bagaimana versi Anda selama itu masuk akal bagi Anda dan semua orang yang menggunakannya. Di mana versi dalam format standar penting adalah ketika Anda memiliki banyak konsumen lain dari API Anda yang perlu tahu "apa arti versi ini?"

Memiliki sistem versi yang sewenang-wenang akan membingungkan orang-orang yang terbiasa dengan sistem lain, seperti versi semantik. Tetapi jika tidak ada yang benar-benar menggunakan sistem versi Anda kecuali orang yang membuatnya - itu tidak masalah.

enderland
sumber
Mengenai hasil edit Anda di atas: Biarkan saya berperan sebagai pendukung iblis di sini. Audit PCI membebani biaya perusahaan, dan tidak semua fitur yang diterapkan menjadi perhatian mereka. Jadi mengapa harus mengeluarkan biaya dan overhead lain hanya dengan prinsip? Bagaimana ini mengkhawatirkan? Saya menyadari metode penentuan audit mungkin cacat, tetapi pemisahan kekhawatiran tampaknya masuk akal. Hal-hal yang tidak terkait dengan pemrosesan kartu dari jarak jauh tidak relevan dengan PCI.
void.pointer
@ void.pointer Saya tidak dalam posisi untuk menilai mengapa / bagaimana audit Anda ditentukan. Tetapi seseorang memutuskan bahwa mereka ingin mengaudit berdasarkan kriteria tertentu. Sengaja mengabaikan kriteria audit yang tampaknya memprihatinkan (terlepas dari berapa banyak uang yang Anda hemat dengan melakukannya).
enderland
1
@ void.pointer, enderland benar. Jika seorang teroris mengancam untuk membunuh keluarga Anda jika versi Anda tidak seluruhnya terdiri dari huruf-huruf alfabet, masalah sebenarnya adalah teroris. Merasa bebas untuk tidak mengikuti versi semantik untuk mengatasinya (pada kenyataannya, saya akan sangat menyarankannya dalam kasus ini), tetapi sebenarnya adalah: solusi yang diperlukan oleh masalah yang berbeda.
Paul Draper
1
@ PaulDraper Kapan semver menjadi One True Way ke versi?
Andy
1
@Andy, tidak. OP bertanya tentang SemVer. IDK kenapa, tapi itu yang dia lakukan.
Paul Draper
8

Dalam versi Semantic Versioning saat ini, yaitu 2.0.0 , no. Ada persyaratan yang mendefinisikan versi sebagai bentuk XYZ di mana X, Y, dan Z adalah bilangan bulat non-negatif yang tidak mengandung 0s:

Nomor versi normal HARUS mengambil bentuk XYZ di mana X, Y, dan Z adalah bilangan bulat non-negatif, dan TIDAK HARUS berisi nol terkemuka. X adalah versi utama, Y adalah versi minor, dan Z adalah versi tambalan. Setiap elemen HARUS meningkat secara numerik. Misalnya: 1.9.0 -> 1.10.0 -> 1.11.0.

Namun, kemampuan untuk menambahkan metadata diizinkan untuk:

Metadata build MUNGKIN dilambangkan dengan menambahkan tanda tambah dan serangkaian pengidentifikasi titik terpisah segera setelah patch atau versi pra-rilis. Pengidentifikasi HARUS hanya terdiri dari alfanumerik ASCII dan tanda hubung [0-9A-Za-z-]. Pengidentifikasi TIDAK HARUS kosong. Bangun metadata HARUS diabaikan ketika menentukan prioritas versi. Jadi dua versi yang berbeda hanya dalam build metadata, memiliki prioritas yang sama. Contoh: 1.0.0-alpha + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85.

Namun, sesuatu yang penting untuk dicatat adalah bahwa Semantic Versioning khusus untuk perangkat lunak yang menyatakan API publik:

Perangkat lunak menggunakan Semantic Versioning HARUS mendeklarasikan API publik. API ini dapat dinyatakan dalam kode itu sendiri atau ada secara ketat dalam dokumentasi. Namun itu dilakukan, harus tepat dan komprehensif.

Ini cenderung mendukung pengembangan perpustakaan atau layanan dan bukan pada tingkat aplikasi.

Yang penting untuk dipertimbangkan adalah apa arti nomor versi Anda, baik untuk penggunaan internal maupun eksternal. Versi hanyalah pengidentifikasi yang memungkinkan Anda berbicara tentang perbedaan dalam perangkat lunak pada dua titik waktu yang berbeda. Semantic Versioning adalah salah satu metode untuk menerapkan aturan ini, jadi jika Anda tahu bahwa suatu aplikasi menggunakan Semantic Versioning, maka Anda dapat lebih mudah menentukan tingkat upaya yang diperlukan untuk memperbarui paket Anda. Mengikuti standar umum mungkin baik, tetapi jika Anda tidak bisa karena alasan apa pun, mendokumentasikan aturan untuk pengguna Anda juga harus memadai.

Thomas Owens
sumber
+1 untuk catatan API publik. Kami tidak memiliki API publik tetapi kami memiliki kemampuan untuk merusak kompatibilitas di aspek lain, seperti data. Mungkin kami mengirimkan bangunan yang diinstal pada rilis lama tetapi data tidak berubah, dan kami tidak lagi dapat membaca data itu (biasanya kami mendukung format lama)
void.pointer