Apa perbedaan antara tilde (~) dan caret (^) di package.json?


3387

Setelah saya upgrade ke stable terbaru nodedan npm, saya mencoba npm install moment --save. Ini menyimpan entri package.jsondengan ^awalan tanda sisipan . Sebelumnya, itu adalah ~awalan tilde .

  1. Mengapa perubahan ini dilakukan npm?
  2. Apa perbedaan antara tilde ~dan caret ^?
  3. Apa kelebihannya dibanding yang lain?

42
FYI Anda dapat mencegah prefiks atau menggunakan satu kustom dengan melakukan: npm config set save-prefix=''. (Tempelkan ~kutipan jika itu yang Anda inginkan.) Saya pribadi melakukan ini dan menyusut untuk hal-hal dalam produksi.
fncomp

19
Semua detail penting tentang bagaimana tilde dan caret bekerja dan perbedaan: github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
Alat ini adalah penolong yang hebat untuk menguji semver.npmjs.com
chaiyachaiya

@ fncomp hanya ingin mengklarifikasi jika saya mendapatkan komentar Anda dengan benar .. apakah Anda hanya menggunakan versi dependensi tertentu dalam proyek Anda? tim kami ragu untuk memutakhirkan dependensi .. bisakah Anda merekomendasikan menggunakan versi spesifik atau awalan '~' untuk dependensi ..?
blog4t

@fcomp bisa tolong jelaskan apa yang Anda maksud dengan mengatakan "Saya pribadi melakukan ini dan menyusut untuk hal-hal dalam produksi". Terima kasih!
blog4t

Jawaban:


3849

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.3akan 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.4akan menggunakan rilis dari 2.3.4 ke <3.0.0.

Lihat Komentar di bawah.


325
Posting di sini untuk mudah-mudahan menangkap orang yang tidak cukup memikirkan hal ini, tetapi keduanya ^ dan ~ mengasumsikan Anda dapat mempercayai rilis minor dan menunjuk dari dependensi Anda. Jika Anda menerbitkan perpustakaan dan ingin orang lain memercayai Anda, JANGAN MENERIMA PENUTUPAN DOWNSTREAM. Pelepasan titik yang buruk dari ketergantungan Anda dapat menyebabkan reaksi berantai ke atas, dan akan membuat orang mengetuk pintu ANDA ketika segala sesuatunya berubah bentuk. Ini adalah alasan besar lainnya untuk menggunakan npm shrinkwrap pada kode produksi Anda.
tehfoo

8
Anda juga bisa menghilangkan semua omong kosong dari npm dengan menambahkan versi Anda dengan a ^atau a ~. Tetapkan ini jika Anda ingin memiliki kontrol ketat atas versi Anda: npm config set save-prefix=''
kumarharsh

5
@prasanthv benar: dari docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0 .4. Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [utama, kecil, tambalan]. Dengan kata lain, ini memungkinkan pembaruan patch dan minor untuk versi 1.0.0 dan di atasnya, pembaruan patch untuk versi 0.X> = 0.1.0, dan tidak ada pembaruan untuk versi 0.0.X.
rofrol

15
@ jgillich di semver saat Anda gunakan 0.2.x, 2bukan a major 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.4
rofrol

11
@FagnerBrack: Contoh spesifik yang Anda berikan benar, tetapi umumnya cara berpikir Anda salah. Contoh: mari kita katakan Anda memiliki paket Adalam 3 versi: 0.0.1, 0.0.2dan 0.0.3. Ada bug di 0.0.1sehingga Anda ingin memiliki setidaknya 0.0.2dalam paket Anda B. Jika Anda menulis, 0.0.xAnda akan mendapatkannya 0.0.3, itu OK. Tetapi jika beberapa paket lain Cmembutuhkan keduanya Bdan Ajuga memiliki batasan "A": "<0.0.2"Anda akan mendapatkan 0.0.1tanpa menunjukkan masalah konflik, yang bukan apa yang Anda inginkan. Menggunakan tilde ~0.0.2akan membantu Anda menghindari masalah ini.
Maciej Sz

863

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.0
  • http://sometarballurl (ini mungkin URL tarball yang akan diunduh dan diinstal secara lokal
  • * Cocok dengan versi apa pun
  • latest Dapatkan rilis terbaru

Daftar di atas tidak lengkap. Penentu versi lain termasuk url GitHub dan repo pengguna GitHub, jalur lokal dan paket dengan tag npm tertentu


8
Dimungkinkan juga untuk menentukan kisaran versi yang tepat, seperti 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.
CodeManX

Tautan yang lebih spesifik dari yang di atas -> docs.npmjs.com/files/package.json#dependencies
Toby

"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!
Scott Stafford

636

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.

meja semver

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:

diagram semver

Sumber: "Cheatsheet Semantic Versioning" .


2
Bagaimana dengan ^ 0.2.5? dari docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [utama, kecil, tambalan]. Dengan kata lain, ini memungkinkan pembaruan patch dan minor untuk versi 1.0.0 dan di atasnya, pembaruan patch untuk versi 0.X> = 0.1.0, dan tidak ada pembaruan untuk versi 0.0.X.
rofrol

11
@rofrol versi apa pun sebelum 1.0.0 dianggap tidak stabil dan aturan ini tidak berlaku
pspi

2
Jadi penjelasan Anda tidak lengkap
rofrol

5
@ profil ya, menghilangkan untuk keterbacaan kadang-kadang bagus, kemungkinan memiliki sesuatu di bawah 1.0.0 untuk ketergantungan pada paket json cukup rendah. lihat juga prinsip 20/80, adalah aturan yang bagus untuk fokus pada hal
pspi

1
@pspi Memiliki versi di bawah 1.0.0 tidak mungkin? Dari 60 yang kami punya ~ 15, dan kebanyakan dari mereka tidak jelas.
Dave Newton

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Gunakan kalkulator semver npm untuk pengujian. (Meskipun penjelasan untuk ^ (termasuk segala sesuatu yang lebih besar dari versi tertentu dalam rentang utama yang sama) dan ~ (termasuk semuanya lebih besar dari versi tertentu dalam rentang minor yang sama) tidak 100% benar, kalkulator tampaknya berfungsi dengan baik )
  • Atau, gunakan SemVer Check sebagai gantinya, yang tidak mengharuskan Anda untuk memilih paket dan juga menawarkan penjelasan.

Izinkan atau larang perubahan

  • Versi pin: 1.2.3.
  • Gunakan ^(seperti kepala). Mengizinkan pembaruan pada level bukan nol kedua dari kiri: ^0.2.3berarti 0.2.3 <= v < 0.3.
  • Gunakan ~(seperti ekor). Umumnya membeku paling kanan tingkat atau menetapkan nol jika dihilangkan:
    • ~1 cara 1.0.0 <= v < 2.0.0
    • ~1.2berarti 1.2.0 <= v < 1.3.0.
    • ~1.2.4berarti 1.2.4 <= v < 1.3.0.
  • Ommit level paling kanan: 0.2berarti 0.2 <= v < 1. Berbeda dari ~karena:
    • Memulai versi level yang dihilangkan selalu 0
    • Anda dapat mengatur mulai versi utama tanpa menentukan sublevel.

Semua kemungkinan (semoga)

Atur mulai tingkat utama dan biarkan pembaruan ke atas

*  or "(empty string)   any version
1                         v >= 1

Bekukan level utama

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

Bekukan level minor

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

Bekukan tingkat patch

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

Larang pembaruan

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Perhatikan : Hilang mayor, minor, tambalan atau menentukan betatanpa nomor, sama dengan anyuntuk level yang hilang.

Perhatian : Ketika Anda menginstal paket yang memiliki 0tingkat utama, pembaruan hanya akan menginstal versi tingkat beta / pr baru! Itu karena npmset ^sebagai default package.jsondan ketika versi yang diinstal seperti 0.1.3, itu membekukan semua tingkat utama / minor / patch.


Memberitahu orang untuk menghindari memulai proyek dari 0 karena perpustakaan dan pengembang yang tidak mengerti sistem adalah solusi yang mengerikan. Saya pikir @asdfasdfads memiliki informasi yang jauh lebih baik.
ProLoser

@ProLoser Saya hanya berpikir bahwa sistemnya harus disederhanakan, dan kita seharusnya tidak menggunakan versi 0.x.
rofrol

1
Kasus penggunaan sekitar pengembangan siklus hidup awal dan v0 membuat BANYAK akal. Mempelajari bagaimana v0 berperilaku baik sebenarnya membuat saya menantikan proyek siklus awal lainnya. Ini berarti Anda dapat memiliki API yang berubah dengan cepat dengan banyak ketidaksesuaian mundur tanpa dipaksa untuk mendeklarasikan proyek Anda sebagai 1.x (alias: stable) padahal sebenarnya tidak.
ProLoser

Saya memahaminya, tapi saya tidak suka cara kerjanya dengan semver dan kualifikasi
rofrol

2
Rasanya lebih seperti pendapat dan tidak harus dibingkai sebagai pendekatan yang diterima secara umum. Dan ^ 0,1.x mendapat tambalan dengan sangat baik.
ProLoser

93

~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.


13
tidak benar: Rentang Caret ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [utama, kecil, tambalan]. Dengan kata lain, ini memungkinkan pembaruan patch dan minor untuk versi 1.0.0 dan di atasnya, pembaruan patch untuk versi 0.X> = 0.1.0, dan tidak ada pembaruan untuk versi 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4-4
rofrol

6
Jawaban ini sepenuhnya salah (seperti banyak lainnya di sini). Tak satu pun dari ini pernah memperbaiki nomor utama! Seperti yang dikatakan @rofrol, ^ membiarkan digit paling tidak nol yang tersisa tidak berubah. ~ di sisi lain hanya memperbolehkan pembaruan patch jika versi minor ditentukan (mis. ~ 1.2.3 atau ~ 1.2) dan memungkinkan pembaruan kecil jika versi minor tidak ditentukan (mis. ~ 1).
TheBaj

2
@TheBaj Maksudnya "fix" sebagai "define" ("fixate") daripada "menyesuaikan", jadi Anda semua sepakat tentang bagaimana nomor utama ditangani.
maaartinus

1
Ya, jawaban ini tampak sangat terbalik sampai saya menyadari bahwa penjawabnya berarti "memperbaiki" seperti dalam "untuk membuat tetap, stasioner, atau tidak berubah."
NattyC

57

~: Cukup dekat dengan

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Kompatibel dengan

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

17
@kytwb - tidak. Dalam kasus khusus nomor versi rilis nol, karat setara dengan tilde. Dengan demikian ^0.1.3hanya menerima versi 0.1.xdan tidak akan menerima 0.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).
chharvey

31

^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


2
tidak benar: Rentang Caret ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [utama, kecil, tambalan]. Dengan kata lain, ini memungkinkan pembaruan patch dan minor untuk versi 1.0.0 dan di atasnya, pembaruan patch untuk versi 0.X> = 0.1.0, dan tidak ada pembaruan untuk versi 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4-4
rofrol

28

Topi yang cocok dapat dianggap "rusak" karena wont memperbarui ^0.1.2ke 0.2.0. Ketika perangkat lunak muncul, gunakan 0.x.yversi 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: misalnya 1.0.0-> 2.0.0-> 3.0.0. Jadi, pada saat perangkat lunak Anda akhirnya selesai 100% dan fitur lengkap akan seperti versi 11.0.0dan itu tidak terlihat sangat berarti, dan sebenarnya terlihat membingungkan. Sebaliknya, jika Anda menggunakan 0.1.x->0.2.x->0.3.xversi kemudian pada saat perangkat lunak akhirnya 100% selesai dan fitur lengkap dirilis sebagai versi 1.0.0dan 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.yversi ketika perangkat lunak Anda belum jatuh tempo dan lepaskan dengan menambah digit tengah ketika API publik Anda berubah (karena itu orang yang ^0.1.0tidak akan mendapatkan 0.2.0pembaruan dan tidak akan merusak kode mereka). Kemudian, ketika perangkat lunak matang, lepaskan di bawah 1.0.0dan tambahkan digit paling kiri setiap kali perubahan API publik Anda (karena itu orang yang ^1.0.0tidak akan mendapatkan 2.0.0pembaruan dan tidak akan merusak kode mereka).

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.

Komentar ini sangat membantu dan sepertinya tidak didokumentasikan dengan baik. Apakah Anda memiliki tautan ke dokumentasi tentang perilaku ini? Jawaban tentang proyek v0 ini telah banyak membantu saya.
ProLoser

Saya tidak memiliki tautan: Saya menemukan informasi ini juga dengan googling dan bermain dengan kalkulator versi semantik npm semver.npmjs.com
catamphetamine

2
Perlu ditambahkan ke dokumentasi mereka dengan cara yang lebih formal. Saya memberi ceramah di Sony kepada tim teknik saya karena tampaknya begitu mudah diabaikan. slides.com/proloser/semver-v0
ProLoser

24

~ Tilde:

  • ~membekukan angka besar dan kecil.
  • Ini digunakan ketika Anda siap untuk menerima perbaikan bug dalam ketergantungan Anda, tetapi tidak ingin ada perubahan yang berpotensi tidak kompatibel.
  • 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.
  • Tilde (~) memberi Anda rilis perbaikan bug

^ Caret:

  • ^ membekukan 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.
  • 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 bertahan pada 2.0.0.
  • Caret (^) juga memberi Anda fungsionalitas baru yang kompatibel dengan mundur.

1
Tilde cocok dengan versi patch terbaru (nomor terakhir). Tanda sisipan cocok dengan versi minor terbaru (nomor tengah).
Abdul Rauf

"membeku" adalah penjelasan terbaik.
mhrabiee

Caret keduanya membekukan nomor utama dan akan memperbarui Anda ke versi utama terbaru (nomor pertama)? Angka utama adalah angka pertama, jadi ini tidak masuk akal.
NattyC

19

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.


3
Jawaban ini menyesatkan. SemVer dengan jelas menyatakan, Nomor versi normal HARUS berbentuk XYZ [di mana] X adalah versi utama, Y adalah versi minor, dan Z adalah versi tambalan.
Leo

15

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

~ : versi utama sudah diperbaiki, versi minor sudah diperbaiki, cocok dengan semua nomor build

misal: ~ 2.4.1 berarti ia akan memeriksa 2.4.x di mana x adalah apa saja

^ : versi utama sudah diperbaiki, cocok dengan versi minor apa pun, cocok dengan nomor build apa pun

misalnya: ^ 2.4.1 berarti ia akan memeriksa 2.xx di mana x adalah apa saja


5
Saya melihat 7 baris dalam jawaban ini
FluxLemur

11

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


Sekali lagi, jawaban ini menyesatkan. SemVer dengan jelas menyatakan, Nomor versi normal HARUS berbentuk XYZ [di mana] X adalah versi utama, Y adalah versi minor, dan Z adalah versi tambalan.
Leo

5

semver terpisah menjadi 3 bagian utama yang dipecah oleh titik-titik.

major.minor.patch
1.0.0

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.

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

Tilde (~)

versi utama diperbaiki, versi minor diperbaiki, cocok dengan nomor build apa pun

"express": "~4.13.3" 

~4.13.3 berarti ia akan memeriksa 4.13.x di mana x adalah apa saja dan 4.14.0

Caret (^)

versi mayor diperbaiki, cocok dengan versi minor apa pun, cocok dengan nomor build apa pun

"supertest": "^3.0.0"

^3.0.0 berarti ia akan memeriksa 3.xx di mana x adalah apa pun


Bisakah Anda menguraikan bagaimana jawaban ini berbeda dari jawaban yang sama yang diposting 4 tahun lalu ?
Franklin Yu

2

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.


1
Bisakah Anda menguraikan bagaimana jawaban ini berbeda dari jawaban yang sama yang diposting 4 tahun lalu ?
Franklin Yu

2

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:

  • Rilis tambalan: 1.0 atau 1.0.x atau ~ 1.0.4
  • Rilis minor: 1 atau 1.x atau ^ 1.0.4
  • Rilis besar: * atau x

Untuk informasi lebih lanjut tentang sintaks versi semantik, lihat kalkulator semver npm .

npm versi semantik dalam paket yang diterbitkan§

Lebih banyak dari dokumentasi npm Tentang versi semantik


1

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

Mengizinkan perubahan yang tidak mengubah digit paling kiri yang bukan nol di tupel [utama, kecil, tambalan].

Berarti ^10.2.3cocok10.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.



0

Terkait dengan pertanyaan ini, Anda dapat meninjau dokumentasi Komposer pada versi , tetapi singkatnya di sini:

  • Rentang Versi Tilde ( ~ ) - ~ 1.2.3 setara dengan> = 1.2.3 < 1.3.0
  • Rentang Versi Karet ( ^ ) - ~ 1.2.3 setara dengan> = 1.2.3 < 2.0.0

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.