Singkatnya, sintaks untuk nomor versi Bower (dan NPM) disebut SemVer, yang merupakan kependekan dari 'Semantic Versioning'. Anda dapat menemukan dokumentasi untuk sintaksis terperinci dari SemVer seperti yang digunakan dalam Bower dan NPM pada API untuk pengurai semver dalam Node / npm . Anda dapat mempelajari lebih lanjut tentang spesifikasi yang mendasarinya (yang tidak menyebutkan ~
atau detail sintaks lainnya) di semver.org .
Ada kalkulator semver visual super berguna yang bisa Anda mainkan, membuat semua ini jauh lebih mudah untuk grok dan diuji.
SemVer bukan hanya sintaks! Ini memiliki beberapa hal yang cukup menarik untuk dikatakan tentang cara-cara yang benar untuk mempublikasikan API, yang akan membantu untuk memahami apa arti sintaksis. Yang terpenting:
Setelah Anda mengidentifikasi API publik Anda, Anda mengkomunikasikan perubahan itu dengan peningkatan spesifik ke nomor versi Anda. Pertimbangkan format versi XYZ (Major.Minor.Patch) . 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.
Jadi, pertanyaan spesifik Anda ~
terkait dengan skema Major.Minor.Patch. (Seperti halnya operator caret terkait ^
.) Anda dapat menggunakan ~
untuk mempersempit rentang versi yang bersedia Anda terima:
- perubahan tingkat patch berikutnya ke versi minor yang sama ( "perbaikan bug tidak memengaruhi API" ), atau:
- perubahan tingkat minor berikutnya ke versi utama yang sama ( "penambahan / perubahan API yang kompatibel ke belakang" )
Sebagai contoh: untuk menunjukkan Anda akan mengambil perubahan tingkat tambalan berikutnya pada pohon 1.2.x, dimulai dengan 1.2.0, tetapi kurang dari 1.3.0, Anda dapat menggunakan:
"angular": "~1.2"
or:
"angular": "~1.2.0"
Ini juga memberi Anda hasil yang sama dengan menggunakan .x
sintaks:
"angular": "1.2.x"
Tetapi, Anda dapat menggunakan tilde / ~
sintaks untuk lebih spesifik: jika Anda hanya bersedia menerima perubahan level tambalan mulai dari 1.2.4 , tetapi masih kurang dari 1.3.0, Anda akan menggunakan:
"angular": "~1.2.4"
Bergerak ke kiri, menuju versi utama , jika Anda menggunakan ...
"angular": "~1"
... sama dengan ...
"angular": "1.x"
or:
"angular": "^1.0.0"
... dan cocok dengan setiap perubahan tingkat kecil atau tambalan di atas 1.0.0, dan kurang dari 2.0:
Perhatikan bahwa variasi terakhir di atas: ini disebut 'rentang caret' . Tanda sisipan tampak sangat mengerikan >
, jadi Anda akan dimaafkan karena berpikir itu berarti "versi apa pun yang lebih besar dari 1.0.0". (Aku sudah pasti tergelincir pada itu.) Tidak!
Rentang caret pada dasarnya digunakan untuk mengatakan bahwa Anda hanya peduli pada digit paling kiri paling signifikan - biasanya versi utama - dan bahwa Anda akan mengizinkan perubahan minor atau patch-level yang tidak mempengaruhi digit paling kiri itu. Namun, tidak seperti rentang tilde yang menentukan versi utama, rentang caret memungkinkan Anda menentukan titik awal minor / patch yang tepat. Jadi, sementara itu ^1.0.0 === ~1
, rentang tanda sisipan seperti ^1.2.3
memungkinkan Anda mengatakan Anda akan melakukan perubahan apa pun >=1.2.3 && <2.0.0
. Anda tidak bisa melakukan itu dengan rentang tilde.
Itu semua tampak membingungkan pada awalnya, ketika Anda melihatnya dari dekat. Tapi perkecil keluar sebentar, dan pikirkan seperti ini: tanda sisipan hanya memberi tahu Anda bahwa Anda paling peduli dengan angka signifikan yang tersisa. Tilde memungkinkan Anda mengatakan bahwa Anda paling mengkhawatirkan digit mana yang paling kanan. Sisanya detail.
Ini adalah kekuatan ekspresif dari tilde dan tanda sisipan yang menjelaskan mengapa orang menggunakannya lebih dari .x
sintaks yang lebih sederhana : mereka hanya membiarkan Anda melakukan lebih banyak. Itu sebabnya Anda akan melihat tilde sering digunakan bahkan di mana .x
akan melayani. Sebagai contoh, lihat npm sendiri: file package.json sendiri menyertakan banyak dependensi dalam ~2.4.0
format, daripada 2.4.x
format yang bisa digunakan. Dengan berpegang teguh pada ~
, sintaks konsisten sepanjang daftar 70+ dependensi versi, terlepas dari mana nomor patch awal dapat diterima.
Bagaimanapun, masih ada lagi untuk SemVer, tapi saya tidak akan mencoba untuk merinci semuanya di sini. Lihat di readme dari paket semver node . Dan pastikan untuk menggunakan kalkulator versi semantik saat Anda berlatih dan mencoba memahami cara kerja SemVer.
RE: Nomor Versi Non-Berturutan: Pertanyaan akhir OP tampaknya tentang menentukan nomor / rentang versi non-berturut-turut (jika saya telah mengeditnya secara adil). Ya, Anda bisa melakukan itu, dengan menggunakan common double-pipe "atau" operator: ||
. Seperti itu:
"angular": "1.2 <= 1.2.9 || >2.0.0"