Setelah saya upgrade ke stable terbaru node
dan npm
, saya mencoba npm install moment --save
. Ini menyimpan entri package.json
dengan ^
awalan tanda sisipan . Sebelumnya, itu adalah ~
awalan tilde .
- Mengapa perubahan ini dilakukan
npm
? - Apa perbedaan antara tilde
~
dan caret^
? - Apa kelebihannya dibanding yang lain?
node.js
npm
package.json
semantic-versioning
Fizer Khan
sumber
sumber
npm config set save-prefix=''
. (Tempelkan~
kutipan jika itu yang Anda inginkan.) Saya pribadi melakukan ini dan menyusut untuk hal-hal dalam produksi.Jawaban:
Lihat dokumen NPM dan dokumen semver :
~ versi "Kira-kira setara dengan versi", akan memperbarui Anda ke semua versi tambalan di masa depan, tanpa menambah versi minor.
~1.2.3
akan menggunakan rilis dari 1.2.3 ke <1.3.0.^ versi "Kompatibel dengan versi", akan memperbarui Anda ke semua versi minor / patch masa depan, tanpa menambah versi utama.
^2.3.4
akan menggunakan rilis dari 2.3.4 ke <3.0.0.Lihat Komentar di bawah.
sumber
^
atau a~
. Tetapkan ini jika Anda ingin memiliki kontrol ketat atas versi Anda:npm config set save-prefix=''
0.2.x
,2
bukan amajor version
. Itu sebabnya docs.npmjs.com menggunakan kata-kata tertentu:the left-most non-zero digit
. Juga bagaimana dengan kasus ini: ^ 0.0.4 berarti 0.0.4A
dalam 3 versi:0.0.1
,0.0.2
dan0.0.3
. Ada bug di0.0.1
sehingga Anda ingin memiliki setidaknya0.0.2
dalam paket AndaB
. Jika Anda menulis,0.0.x
Anda akan mendapatkannya0.0.3
, itu OK. Tetapi jika beberapa paket lainC
membutuhkan keduanyaB
danA
juga memiliki batasan"A": "<0.0.2"
Anda akan mendapatkan0.0.1
tanpa menunjukkan masalah konflik, yang bukan apa yang Anda inginkan. Menggunakan tilde~0.0.2
akan membantu Anda menghindari masalah ini.Saya ingin menambahkan dokumentasi resmi npmjs yang menjelaskan semua metode untuk kekhususan versi termasuk yang disebutkan dalam pertanyaan -
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version
"Kira-kira setara dengan versi" Lihat npm semver - Tilde Ranges & semver (7)^version
"Kompatibel dengan versi" Lihat npm semver - Caret Ranges & semver (7)version
Harus sama persis dengan versi>version
Harus lebih besar dari versi>=version
dll<version
<=version
1.2.x
1.2.0, 1.2.1, dll., Tetapi tidak 1.3.0http://sometarballurl
(ini mungkin URL tarball yang akan diunduh dan diinstal secara lokal*
Cocok dengan versi apa punlatest
Dapatkan rilis terbaruDaftar di atas tidak lengkap. Penentu versi lain termasuk url GitHub dan repo pengguna GitHub, jalur lokal dan paket dengan tag npm tertentu
sumber
1.2.0 || >=1.2.2 <1.3.0
: Tepatnya 1.2.0, atau semuanya dari 1.2.2 hingga 1.3.0 (inklusif), tetapi tidak 1.2.1, atau 1.3.1 dan lebih tinggi, dan juga tidak 1.1 .x dan di bawah."Approximately equivalent to version"
dan"Compatible with version"
merupakan cara yang sangat tidak spesifik untuk menggambarkan perilaku ~ dan ^. Terima kasih @jgillich telah memberikan jawaban yang sebenarnya!npm memungkinkan menginstal versi paket yang lebih baru dari yang ditentukan. Menggunakan tilde (
~
) memberi Anda rilis perbaikan bug dan caret (^
) memberi Anda fungsionalitas baru yang kompatibel juga.Masalahnya adalah versi lama biasanya tidak menerima perbaikan bug sebanyak itu, jadi npm menggunakan caret (
^
) sebagai default untuk--save
.Menurut: "Semver menjelaskan - mengapa ada tanda sisipan (^) di package.json saya?" .
Perhatikan bahwa aturan berlaku untuk versi di atas 1.0.0 dan tidak setiap proyek mengikuti versi semantik. Untuk versi 0.xx, tanda sisir hanya memperbolehkan pembaruan tambalan , artinya berperilaku sama dengan tilde. Lihat "Rentang Karet"
Inilah penjelasan visual dari konsep-konsep tersebut:
Sumber: "Cheatsheet Semantic Versioning" .
sumber
Semver
Izinkan atau larang perubahan
1.2.3
.^
(seperti kepala). Mengizinkan pembaruan pada level bukan nol kedua dari kiri:^0.2.3
berarti0.2.3 <= v < 0.3
.~
(seperti ekor). Umumnya membeku paling kanan tingkat atau menetapkan nol jika dihilangkan:~1
cara1.0.0 <= v < 2.0.0
~1.2
berarti1.2.0 <= v < 1.3.0
.~1.2.4
berarti1.2.4 <= v < 1.3.0
.0.2
berarti0.2 <= v < 1
. Berbeda dari~
karena:0
Semua kemungkinan (semoga)
Atur mulai tingkat utama dan biarkan pembaruan ke atas
Bekukan level utama
Bekukan level minor
Bekukan tingkat patch
Larang pembaruan
Perhatikan : Hilang mayor, minor, tambalan atau menentukan
beta
tanpa nomor, sama denganany
untuk level yang hilang.Perhatian : Ketika Anda menginstal paket yang memiliki
0
tingkat utama, pembaruan hanya akan menginstal versi tingkat beta / pr baru! Itu karenanpm
set^
sebagai defaultpackage.json
dan ketika versi yang diinstal seperti0.1.3
, itu membekukan semua tingkat utama / minor / patch.sumber
~
perbaikan nomor besar dan kecil. Ini digunakan ketika Anda siap untuk menerima perbaikan bug dalam ketergantungan Anda, tetapi tidak ingin ada perubahan yang berpotensi tidak kompatibel.^
memperbaiki nomor utama saja. Ini digunakan ketika Anda mengamati dengan cermat dependensi Anda dan siap untuk dengan cepat mengubah kode Anda jika rilis minor tidak kompatibel.Selain itu,
^
yang tidak didukung oleh versi NPM tua, dan harus digunakan dengan hati-hati.Jadi,
^
ini adalah standar yang baik, tetapi tidak sempurna. Saya sarankan untuk hati-hati memilih dan mengkonfigurasi operator semver yang paling berguna bagi Anda.sumber
~
: Cukup dekat dengan^
: Kompatibel dengansumber
^0.1.3
hanya menerima versi0.1.x
dan tidak akan menerima0.2.0
, meskipun itu kenaikan kecil. Perilaku ini setara dengan~0.1.3
. Alasan di balik perilaku ini adalah karena fakta bahwa paket-paket rilis nol masih dianggap tidak stabil; dalam kata-kata semver.org , # 4, "apa pun dapat berubah kapan saja" (termasuk perubahan yang tidak kompatibel ke belakang).^
adalah 1. [apa saja]. [apa saja] (versi minor terbaru)~
adalah 1.2. [apa saja] (patch terbaru)Bacaan yang bagus adalah posting blog ini tentang bagaimana semver berlaku untuk npm
dan apa yang mereka lakukan untuk membuatnya cocok dengan standar semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
sumber
Topi yang cocok dapat dianggap "rusak" karena wont memperbarui
^0.1.2
ke0.2.0
. Ketika perangkat lunak muncul, gunakan0.x.y
versi dan pencocokan topi hanya akan cocok dengan angka terakhir yang bervariasi (y
). Ini dilakukan dengan sengaja. Alasannya adalah bahwa sementara perangkat lunak berevolusi API berubah dengan cepat: suatu hari Anda memiliki metode ini dan hari lain Anda memiliki metode tersebut dan yang lama hilang. Jika Anda tidak ingin memecahkan kode untuk orang-orang yang sudah menggunakan perpustakaan Anda, Anda pergi dan menambah versi utama: misalnya1.0.0
->2.0.0
->3.0.0
. Jadi, pada saat perangkat lunak Anda akhirnya selesai 100% dan fitur lengkap akan seperti versi11.0.0
dan itu tidak terlihat sangat berarti, dan sebenarnya terlihat membingungkan. Sebaliknya, jika Anda menggunakan0.1.x
->0.2.x
->0.3.x
versi kemudian pada saat perangkat lunak akhirnya 100% selesai dan fitur lengkap dirilis sebagai versi1.0.0
dan itu berarti "Rilis ini adalah layanan jangka panjang, Anda dapat melanjutkan dan menggunakan versi perpustakaan ini dalam kode produksi Anda, dan penulis tidak akan mengubah semuanya besok, atau bulan depan, dan dia tidak akan meninggalkan paket ".Aturannya adalah: gunakan
0.x.y
versi ketika perangkat lunak Anda belum jatuh tempo dan lepaskan dengan menambah digit tengah ketika API publik Anda berubah (karena itu orang yang^0.1.0
tidak akan mendapatkan0.2.0
pembaruan dan tidak akan merusak kode mereka). Kemudian, ketika perangkat lunak matang, lepaskan di bawah1.0.0
dan tambahkan digit paling kiri setiap kali perubahan API publik Anda (karena itu orang yang^1.0.0
tidak akan mendapatkan2.0.0
pembaruan dan tidak akan merusak kode mereka).sumber
~ Tilde:
~
membekukan angka besar dan kecil.^ Caret:
^
membekukan nomor utama saja.sumber
Tilde ~ cocok dengan versi minor, jika Anda telah menginstal sebuah paket yang memiliki 1.4.2 dan setelah instalasi Anda, versi 1.4.3 dan 1.4.4 juga tersedia jika di package.json itu digunakan sebagai ~ 1.4.2 kemudian npm install di proyek Anda setelah peningkatan akan menginstal 1.4.4 di proyek Anda. Tetapi ada 1.5.0 tersedia untuk paket itu maka itu tidak akan diinstal oleh ~. Ini disebut versi minor.
Caret ^ cocok dengan versi utama, jika paket 1.4.2 diinstal di proyek Anda dan setelah instalasi Anda 1.5.0 dirilis maka ^ akan menginstal versi utama. Itu tidak akan memungkinkan untuk menginstal 2.1.0 jika Anda memilikinya ^ 1.4.2 .
Versi tetap jika Anda tidak ingin mengubah versi paket pada setiap instalasi kemudian menggunakan versi tetap tanpa karakter khusus apa pun misalnya "1.4.2"
Versi Terbaru * Jika Anda ingin menginstal versi terbaru maka hanya gunakan * di depan nama paket.
sumber
Penjelasan satu liner
Sistem versi standar adalah major.minor.build (mis. 2.4.1)
npm memeriksa dan memperbaiki versi paket tertentu berdasarkan karakter-karakter ini
misal: ~ 2.4.1 berarti ia akan memeriksa 2.4.x di mana x adalah apa saja
misalnya: ^ 2.4.1 berarti ia akan memeriksa 2.xx di mana x adalah apa saja
sumber
Anda mungkin telah melihat tilde (~) dan caret (^) di package.json. Apa perbedaan di antara mereka?
Ketika Anda melakukan npm install moment --save, ia menyimpan entri di package.json dengan awalan tanda sisipan (^).
The tilde (~)
Dalam istilah yang paling sederhana, tilde (~) cocok dengan versi minor terbaru (angka tengah). ~ 1.2.3 akan cocok dengan semua versi 1.2.x tetapi akan kehilangan 1.3.0.
Tanda sisipan (^)
Karet (^), di sisi lain, lebih santai. Ini akan memperbarui Anda ke versi utama terbaru (nomor pertama). ^ 1.2.3 akan cocok dengan rilis 1.xx apa pun termasuk 1.3.0, tetapi akan ditunda pada 2.0.0.
Referensi: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
sumber
semver terpisah menjadi 3 bagian utama yang dipecah oleh titik-titik.
Perbedaan utama, minor dan patch ini digunakan untuk mengidentifikasi rilis yang berbeda. tide (~) dan caret (^) digunakan untuk mengidentifikasi versi minor dan patch mana yang akan digunakan dalam versi paket.
sumber
Tilde (~)
~4.13.3
berarti ia akan memeriksa 4.13.x di mana x adalah apa saja dan 4.14.0Caret (^)
^3.0.0
berarti ia akan memeriksa 3.xx di mana x adalah apa punsumber
Nomor versi dalam sintaksis yang menunjuk setiap bagian dengan makna yang berbeda. sintaksis dipecah menjadi tiga bagian yang dipisahkan oleh titik.
major.minor.patch 1.0.2
Major, minor dan patch mewakili rilis yang berbeda dari suatu paket.
npm menggunakan tilde (~) dan caret (^) untuk menentukan versi patch dan minor yang digunakan masing-masing.
Jadi jika Anda melihat ~ 1.0.2 artinya menginstal versi 1.0.2 atau versi patch terbaru seperti 1.0.4. Jika Anda melihat ^ 1.0.2 itu berarti menginstal versi 1.0.2 atau versi minor atau patch terbaru seperti 1.1.0.
sumber
karat
^
mencakup segala sesuatu yang lebih besar dari versi tertentu dalam rentang utama yang sama.tilde
~
menyertakan semua yang lebih besar dari versi tertentu dalam rentang minor yang sama.Misalnya, untuk menentukan rentang versi yang dapat diterima hingga 1.0.4, gunakan sintaks berikut:
Untuk informasi lebih lanjut tentang sintaks versi semantik, lihat kalkulator semver npm .
Lebih banyak dari dokumentasi npm Tentang versi semantik
sumber
Bukan jawaban, per se, tapi pengamatan yang tampaknya telah diabaikan.
Deskripsi untuk rentang karat:
lihat: https://github.com/npm/node-semver#caret-ranges-123-025-004
Berarti
^10.2.3
cocok10.2.3 <= v < 20.0.0
Saya tidak berpikir itu yang mereka maksudkan. Menarik versi 11.xx hingga 19.xx akan merusak kode Anda.
Saya pikir mereka maksudkan
left most non-zero number field
. Tidak ada dalam SemVer yang mengharuskan bidang angka menjadi satu digit.sumber
~ spesifikasi untuk rilis versi minor ^ menentukan rilis versi utama
Sebagai contoh jika versi paket 4.5.2, pada Pembaruan ~ 4.5.2 akan menginstal versi 4.5.x terbaru (MINOR VERSION) ^ 4.5.2 akan menginstal versi 4.xx terbaru (VERSION UTAMA)
sumber
Terkait dengan pertanyaan ini, Anda dapat meninjau dokumentasi Komposer pada versi , tetapi singkatnya di sini:
Jadi, dengan Tilde Anda akan mendapatkan pembaruan tambalan secara otomatis tetapi versi minor dan utama tidak akan diperbarui. Namun, jika Anda menggunakan Caret, Anda akan mendapatkan tambalan dan versi minor, tetapi Anda tidak akan mendapatkan versi utama (melanggar perubahan).
Versi Tilde dianggap pendekatan yang "lebih aman", tetapi jika Anda menggunakan dependensi yang dapat diandalkan (pustaka yang dikelola dengan baik) Anda seharusnya tidak memiliki masalah dengan Versi Caret (karena perubahan kecil seharusnya tidak melanggar perubahan.
Anda mungkin harus meninjau posting stackoverflow ini tentang perbedaan antara pemasangan komposer dan pembaruan komposer .
sumber