Apakah sintaks versi bower (dan npm)?

274

Bower memungkinkan saya untuk menentukan persyaratan versi untuk paket menggunakan sintaks berikut:

"dependencies": {
  "<name>": "<version>",
},

Tetapi saya belum dapat menemukan apa sintaks yang digunakan untuk <version>. Saya tahu bahwa saya dapat menentukan versi yang akan:

  • lebih besar dari versi tertentu dengan ">1.0.0"
  • lebih besar atau sama dengan versi: ">=1.0.0"
  • atau dalam beberapa rentang: "1.0.0 - 2.0.0".

Saya juga tahu bahwa ada sintaks versi umum yang mengandung tilde: "~1.0.0". Tetapi saya tidak yakin apa artinya dan apakah itu sama dengan "=1.0.0".

Saya juga tertarik untuk mengetahui apakah saya dapat menentukan beberapa versi yang tidak berurutan, seperti 1.0.3versi tepat plus lebih besar dari 1.5.0, dll ...

Samuel Hapak
sumber
3
Ini mungkin merupakan duplikat dari stackoverflow.com/a/19040351/537738
David

Jawaban:

341

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 .xsintaks:

"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.3memungkinkan 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 .xsintaks yang lebih sederhana : mereka hanya membiarkan Anda melakukan lebih banyak. Itu sebabnya Anda akan melihat tilde sering digunakan bahkan di mana .xakan melayani. Sebagai contoh, lihat npm sendiri: file package.json sendiri menyertakan banyak dependensi dalam ~2.4.0format, daripada 2.4.xformat 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"
XML
sumber
27
Jadi ~secara khusus berarti nomor tambalan (ketiga) mungkin lebih besar dari yang ditentukan, misalnya ~1.2.3setara dengan >=1.2.3 <1.3.0.
z0r
1
Dapat juga digunakan untuk nomor minor (kedua), per suntingan sebaris di atas.
XML
menarik, bahwa dokumentasi SemVer juga tampaknya memungkinkan notasi-x (yang jauh lebih intuitif untuk manusia).
Frank Nocke
2
notasi-x bersifat intuitif untuk dibaca pada awalnya, tetapi jauh lebih tidak fleksibel. Misalnya '1.1.x' === '>=1.1.0' === '~1.1.0',. Kasing 1.1.0 mudah. Tapi notasi-x tidak bisa granular, seperti yang bisa '>=1.1.4'atau '~1.1.4'. Jadi, Anda berakhir dengan '1.1.x'di satu tempat di daftar ketergantungan Anda, dan '~2.7.3'di tempat lain. Tidak apa-apa, dan berfungsi, tetapi pengembang kemudian perlu mem-parsing beberapa sintaks untuk membaca satu daftar. Dan, jika Anda menulis paket untuk mengatur versi program, Anda ingin satu sintaks. Dan, kebanyakan orang ingin mencegah perubahan yang melanggar. Karenanya, semua masalah diselesaikan dengan ~.
XML
1
Hah. Saya pikir "grok" kurang geografis daripada budaya nerd-lit (dan mungkin terkait usia), @Clonkex. Untuk pembaca masa depan: ini adalah referensi untuk Heinlein's Stranger in a Strange Land ...
XML
141

Berdasarkan semver , Anda bisa menggunakan

  • Hyphen Ranges XYZ - ABC 1.2.3-2.3.4 Menunjukkan > = 1.2.3 <= 2.3.4

  • X-Ranges 1.2.x 1.X 1.2.*

  • Tilde Ranges ~1.2.3 ~1.2 Menunjukkan memungkinkan perubahan tingkat patch atau perubahan versi kecil.

  • Rentang Caret ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [mayor, minor, patch]

    • ^1.2.x (berarti> = 1.2.0 <2.0.0)
    • ^0.0.x (berarti> = 0,0.0 <0,1.0)
    • ^0.0 (berarti> = 0,0.0 <0,1.0)
Jerome Anthony
sumber
21
Terima kasih atas jawaban yang tidak masuk akal, mudah dibaca. Saya tidak perlu melacak kembali atau apa pun, hanya, boom, ada jawabannya. Bagus;)
toddmo
76

Bower menggunakan sintaks semver , tetapi berikut adalah beberapa contoh cepat:

Anda dapat menginstal versi tertentu:

$ bower install jquery#1.11.1

Anda dapat menggunakan ~ untuk menentukan 'versi apa pun yang dimulai dengan ini':

$ bower install jquery#~1.11

Anda dapat menentukan beberapa persyaratan versi secara bersamaan:

$ bower install "jquery#<2.0 >1.10"
Wilfred Hughes
sumber
1
Saya ingin tahu tentang penggunaan praktis ini. Instalasi roulette?
gravidThoughts
Melihat jawaban @ XMLilley (dan semver docs) 'permulaan dengan' tampaknya salah, karena 1.12, 1.13 juga akan baik-baik saja, selama versi utama tidak naik ...
Frank Nocke
13

Anda juga dapat menggunakan latestkata kunci untuk menginstal versi terbaru yang tersedia:

  "dependencies": {
    "fontawesome": "latest"
  }
shacker
sumber
1
semver tidak menyebutkan ini. Di mana Anda menetapkan itu valid? :) Itu mengatakan " "*" := >=0.0.0(Versi memuaskan)" yang dekat tapi agak kabur karena tidak secara khusus mengatakan terbaru sehingga bisa menjadi yang pertama ditemukan?
GazB
Sejujurnya, itu hanya trial and error - saya mencobanya dan berhasil! Anda mungkin benar bahwa itu tidak 100% valid, tetapi tidak berfungsi.
Shacker
7

Jika tidak ada nomor tambalan, ~sama dengan menambahkan .xke versi non-tilde. Jika ada nomor tambalan, ~izinkan semua nomor tambalan> = yang ditentukan.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

Saya tidak punya cukup poin untuk mengomentari jawaban yang diterima, tetapi beberapa informasi tilde bertentangan dengan dokumentasi semver tertaut: tidak"angular": "~1.2" akan cocok dengan 1,3, 1.4, 1.4.9. Juga dan yang tidak setara. Ini dapat diverifikasi dengan kalkulator semver npm ."angular": "~1""angular": "~1.0"

Decima
sumber