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


Setelah saya upgrade ke stabil terbaru node dan npm, Saya mencoba npm install moment --save. Ini menyimpan entri di package.json dengan caret(^) awalan. Sebelumnya, itu adalah a tilde(~) awalan.

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

2242
2018-03-12 06:02


asal


Jawaban:


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   lewatkan 1.3.0.

Sisipan, di sisi lain, lebih rileks. Ini akan memperbarui Anda ke   versi utama terbaru (nomor pertama). ^ 1.2.3 akan cocok   setiap rilis 1.x.x termasuk 1.3.0, tetapi akan menunda 2.0.0.

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/


2626
2018-03-12 08:28



Saya ingin menambahkan dokumentasi npmjs resmi yang menjelaskan semua metode untuk spesifikasi versi termasuk yang dirujuk 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 mencocokkan versi dengan tepat
  • >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 tarbal yang akan diunduh dan dipasang secara lokal
  • * Cocok dengan versi apa pun
  • latest Dapatkan rilis terbaru

Daftar di atas tidak lengkap. Specifiers versi lainnya termasuk url GitHub dan GitHub repo pengguna, jalur dan paket lokal dengan tag npm spesifik


568
2017-09-16 06:25



NPM memungkinkan menginstal versi paket yang lebih baru daripada yang ditentukan. Menggunakan tilde (~) memberi Anda rilis perbaikan bug dan tanda sisipan (^) memberi Anda fungsionalitas baru yang kompatibel juga.

Masalahnya adalah versi lama biasanya tidak menerima perbaikan bug yang banyak, jadi npm menggunakan caret (^) sebagai default untuk --save.

semver table

Menurut: "Semer menjelaskan - mengapa ada tanda sisipan (^) di paket saya.json?".

Catatan bahwa aturan berlaku untuk versi di atas 1.0.0 dan tidak setiap proyek mengikuti versi semantik. Untuk versi 0.x.x, tanda sisipan memungkinkan saja tambalan pembaruan, yaitu, ia berperilaku sama dengan tilde. Lihat "Caret Ranges"

Berikut penjelasan visual konsep-konsepnya:

semver diagram

Sumber: "Cheatsheet Pengurutan Versi Semantik".


346
2017-07-30 20:40



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

^ hanya memperbaiki nomor utama. Ini digunakan ketika Anda mengamati dengan seksama ketergantungan Anda dan siap untuk dengan cepat mengubah kode Anda jika rilis kecil tidak akan kompatibel.

Selain itu, ^ aku s tidak didukung oleh versi npm lama, dan harus digunakan dengan hati-hati.

Begitu, ^ adalah default yang bagus, tetapi tidak sempurna. Saya sarankan untuk secara hati-hati memilih dan mengkonfigurasi operator semifinal yang paling berguna bagi Anda.


74
2018-03-12 23:05



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Menggunakan npm semver calculator untuk pengujian. (Meskipun penjelasan untuk ^ (termasuk semuanya 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 Pemeriksaan SemVer sebaliknya, yang tidak mengharuskan Anda memilih paket dan juga menawarkan penjelasan.

Mengizinkan atau tidak mengizinkan perubahan

  • Versi pin: 1.2.3.
  • Menggunakan ^ (seperti kepala). Memungkinkan pembaruan pada tingkat non-nol kedua dari kiri: ^0.2.3 cara 0.2.3 <= v < 0.3.
  • Menggunakan ~ (seperti ekor). Umumnya membekukan level paling kanan atau atur nol jika dihilangkan:
    • ~1 cara 1.0.0 <= v < 2.0.0
    • ~1.2 cara 1.2.0 <= v < 1.3.0.
    • ~1.2.4 cara 1.2.4 <= v < 1.3.0.
  • Ommit tingkat paling kanan: 0.2 cara 0.2 <= v < 1. Berbeda dari ~ karena:
    • Mulai versi tingkat yang dihapus selalu 0
    • Anda dapat mengatur mulai versi utama tanpa menentukan sublevel.

Semua (semoga) kemungkinan

Atur mulai level utama dan perbolehkan pembaruan ke atas

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

Bekukan tingkat 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 tingkat 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 tambalan tingkat

~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

Melihat: Hilang besar, kecil, tambalan atau menentukan beta tanpa nomor, sama dengan any untuk level yang hilang.

Melihat: Saat Anda menginstal paket yang memiliki 0 sebagai level utama, pembaruan hanya akan menginstal versi beta / pr level baru! Itu karena npm set ^ sebagai default di package.json dan ketika versi yang diinstal seperti 0.1.3, membekukan semua level mayor / minor / patch.


66
2017-10-11 16:52



~ : Cukup dekat untuk

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Cocok 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

42
2018-06-27 16:12



Pencocokan topi dapat dianggap "rusak" karena tidak memperbarui ^0.1.2 untuk 0.2.0. Saat perangkat lunak mulai digunakan 0.x.y versi dan pencocokan topi hanya akan cocok dengan angka yang bervariasi terakhir (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 menaikkan versi utama: mis. 1.0.0 -> 2.0.0 -> 3.0.0. Jadi, pada saat perangkat lunak Anda akhirnya 100% selesai dan fitur lengkap akan menjadi seperti versi 11.0.0 dan itu tidak terlihat sangat berarti, dan sebenarnya terlihat membingungkan. Jika Anda, di sisi lain, menggunakan 0.1.x -> 0.2.x -> 0.3.x versi kemudian pada saat perangkat lunak ini akhirnya 100% selesai dan fitur lengkap dirilis sebagai versi 1.0.0 dan itu berarti "Rilis ini adalah layanan jangka panjang, Anda dapat melanjutkan dan menggunakan versi pustaka 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 mengversi ketika perangkat lunak Anda belum matang dan merilisnya dengan menambah digit tengah ketika perubahan API publik Anda (oleh karena itu orang memiliki ^0.1.0 tidak akan mendapatkan 0.2.0 perbarui dan tidak akan merusak kode mereka). Kemudian, ketika perangkat lunak matang, lepaskan di bawah 1.0.0 dan menaikkan digit paling kiri setiap kali API publik Anda berubah (oleh karena itu orang memiliki ^1.0.0 tidak akan mendapatkan 2.0.0 perbarui 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.

21
2017-10-19 11:24



^ adalah 1. [any]. [any] (versi minor terbaru)
~ adalah 1,2. [any] (patch terbaru)

Bacaan yang bagus posting blog ini tentang bagaimana semver berlaku untuk npm
dan apa yang mereka lakukan untuk membuatnya cocok standar semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20
2017-12-15 18:07