Apa perbedaan antara npm-shrinkwrap.json dan package-lock.json?

158

Dengan rilis npm @ 5 , sekarang akan menulis a package-lock.jsonkecuali npm-shrinkwrap.jsonsudah ada.

Saya menginstal npm @ 5 secara global melalui:

npm install npm@5 -g

Dan sekarang, jika a npm-shrinkwrap.jsonditemukan selama:

npm install

peringatan akan dicetak:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

Jadi take-away saya adalah saya harus mengganti shrinkwrap dengan package-lock.json.

Namun mengapa ada format baru untuk itu? Apa yang bisa package-lock.jsondilakukan yang npm-shrinkwrap.jsontidak bisa?

k0pernikus
sumber

Jawaban:

176

File-file memiliki konten yang persis sama, tetapi ada beberapa perbedaan dalam cara npm menangani mereka, dijelaskan di situs docs dan juga dalam file docs di repo npm yang dimulai dengan secara eksplisit menangani perbedaan antara dua file ini :

  • package-lock.jsontidak pernah dipublikasikan ke npm, sedangkan npm-shrinkwrapsecara default
  • package-lock.json file yang tidak ada dalam paket tingkat atas diabaikan, tetapi file menyusut milik dependensi dihormati
  • npm-shrinkwrap.jsonkompatibel dengan npm versi 2, 3, dan 4, sedangkan package-lock.jsonhanya dikenali oleh npm 5+

Anda dapat mengonversi yang sudah ada package-lock.jsonmenjadi npm-shrinkwrap.jsondengan menjalankan npm shrinkwrap.

Jadi:

  • Jika Anda tidak mempublikasikan paket Anda ke npm, pilihan antara kedua file ini adalah konsekuensi kecil. Anda mungkin ingin menggunakan package-lock.jsonkarena ini adalah default dan namanya lebih jelas untuk pemula npm; sebagai alternatif, Anda mungkin ingin menggunakan npm-shrinkwrap.jsonkompatibilitas mundur dengan npm 2-4 jika sulit bagi Anda untuk memastikan semua orang di tim pengembangan Anda pada npm 5+. (Perhatikan bahwa npm 5 dirilis pada 25 Mei 2017; kompatibilitas ke belakang akan menjadi semakin tidak penting semakin kita dapatkan dari tanggal itu, karena kebanyakan orang pada akhirnya akan memutakhirkan.)
  • Jika Anda sedang menerbitkan paket Anda untuk NPM, Anda memiliki pilihan antara:

    1. menggunakan a package-lock.jsonuntuk merekam versi dependensi mana yang Anda instal, tetapi memungkinkan orang memasang paket Anda untuk menggunakan versi dependensi apa pun yang kompatibel dengan rentang versi yang ditentukan oleh Anda package.json, atau
    2. menggunakan a npm-shrinkwrap.jsonuntuk menjamin bahwa setiap orang yang menginstal paket Anda mendapatkan versi yang persis sama dari semua dependensi


    Pandangan resmi yang dijelaskan (sangat singkat) dalam dokumen adalah bahwa opsi 1 harus digunakan untuk perpustakaan (mungkin untuk mengurangi jumlah duplikasi paket yang disebabkan ketika banyak dependensi paket semuanya tergantung pada versi yang sedikit berbeda dari ketergantungan sekunder yang sama) , tetapi opsi 2 mungkin masuk akal untuk executable yang akan diinstal secara global.

Mark Amery
sumber
2
+1 - bisakah Anda mengklarifikasi poin kedua Anda? Apa perbedaan antara perilaku itu dan memiliki npm-shrinkwrap?
Rhys
2
@Rhys peluru kedua tidak akan berpengaruh dalam praktik kecuali Anda melakukan sesuatu yang aneh. Pada dasarnya, ia hanya mengatakan bahwa jika perpustakaan entah bagaimana melakukan mempublikasikan package-lock.json(yang tidak mungkin), maka jika Anda menginstal perpustakaan yang sebagai ketergantungan beberapa paket lain, ini perpustakaan package-lock.jsonakan diabaikan oleh NPM. Namun, jika perpustakaan menerbitkan npm-shrinkwrap.json, dan Anda menginstal perpustakaan sebagai dependensi, maka Anda juga akan menginstal sebagai dependensi sekunder versi yang tepat dari semua dependensi yang ditentukan dalam perpustakaan npm-shrinkwrap.json.
Mark Amery
Bisakah Anda menambahkan yang npm ciada untuk memastikan instalasi package-lock.jsonhanya-baca. ( npm installbermutasi package-lock.jsonmenyebabkan kekacauan dan kemungkinan bug dan tidak memanfaatkan package-lock.jsonper se.)
k0pernikus
@ k0pernikus Saya tidak berpikir ada perbedaan antara bagaimana npm cimenangani npm-shrinkwrap.jsondan package-lock.json- apa relevansinya dengan pertanyaan ini tentang perbedaan antara dua file? Juga, setelah membaca sekitar: Saya pikir bahwa " npm install... tidak mengambil keuntungan dari package-lock.json" telah salah sejak npm 5.4 - Saya percaya npm installsekarang menghormati Anda package-lock kecuali itu benar-benar tidak sesuai dengan Anda package.json, dalam hal ini yang terakhir akan diutamakan. (Tapi saya sudah keluar dari dunia JavaScript sebentar - apakah saya melewatkan sesuatu?)
Mark Amery
27

Penjelasan dari Pengembang NPM :

Idenya jelas untuk package-lock.json menjadi yang terbaru dan terhebat dalam teknologi shrinkwrap, dan npm-shrinkwrap.json disediakan untuk beberapa orang berharga di luar sana yang sangat peduli tentang perpustakaan mereka yang memiliki node_modules yang tepat - dan untuk orang yang ingin CI menggunakan npm @> = 2 untuk menginstal pohon tertentu tanpa harus menabrak versi npm nya.

Lockfile baru ("package-lock.json") pada dasarnya berbagi semua kode yang sama, format yang sama persis dengan npm-shrinkwrap (Anda dapat mengganti nama mereka satu sama lain!). Ini juga sesuatu yang tampaknya dipahami oleh komunitas: "ia memiliki file penguncian" tampaknya klik jauh lebih cepat dengan orang-orang. Akhirnya, memiliki file baru berarti bahwa kita bisa memiliki risiko mundur yang relatif rendah dengan shrinkwrap tanpa harus melakukan hal-hal aneh seperti izin-publikasi yang disebutkan dalam pos induk.

Serius
sumber
18
Saya masih tidak jelas tentang perbedaannya. Jika npm-shrinkwrapuntuk node_modules yang tepat .... Saya menganggap package-lock.jsonmengunci kurang dari tepat? Dan jika demikian, apa yang tidak mengunci yang npm-shrinkwrapmengunci?
Don,
Anda salah @man. package-lock adalah versi baru dari npm-shrinkwrap. package-lock adalah opt-out (jadi Anda harus menghapus fitur karena defaultnya diaktifkan), npm-shrinkwrap adalah opt-in (jadi Anda harus mengaktifkannya karena itu tidak termasuk default saya). alasan mengapa mereka memperkenalkan kunci-paket adalah: 1. pengguna sekarang memiliki cara yang lebih aman untuk menangani dependensi karena diaktifkan secara default dan 2. nama tersebut menyiratkan apa yang ada di dalam kata "cincang". npm-shrinkwrap memiliki beberapa pengaturan perilaku ketergantungan khusus yang tidak dimiliki paket-lock sekarang. npm-shrinkwrap sekarang sudah usang.
SeriousM
10
ini tidak benar. Dengan mengatakan bahwa paket-lock adalah versi baru dari npm-shrinkwrap, Anda mengatakan itu adalah pengganti. npm-shrinkwrap tidak usang dan memiliki perbedaan dengan package-lock.json. Lebih lanjut, package-lock.json memiliki bug sementara npm-shrinkwrap tidak ... dengan demikian lebih menekankan bahwa mereka bukan kode yang sama.
dman
Package-lock.json juga mengganggu. Jadi itu dapat dengan mudah menyebabkan konflik scm jika Anda memanggil "npm i" sementara shrinkwrap harus dibuat secara eksplisit dan tidak akan menyebabkan konflik pada server ci. Ya, saya bisa salah di sini.
norekhov
@manman "package-lock.json memiliki bug sementara npm-shrinkwrap tidak" - tidak. Tidak ada indikasi tentang hal itu dalam masalah yang Anda tautkan; bahkan tidak disebutkan npm-shrinkwrap. Seperti yang saya perhatikan dalam jawaban saya, mengonversikan package-lock.jsonke a npm-shrinkwrap.jsonsecara harfiah dilakukan dengan mengganti nama file; mereka adalah "kode yang sama".
Mark Amery
12

Saya pikir idenya adalah agar - save dan shrinkwrap terjadi secara default tetapi hindari masalah potensial dengan shrinkwrap yang terjadi di tempat yang tidak diinginkan. Jadi, mereka hanya memberinya nama file baru untuk menghindari konflik. Seseorang dari npm menjelaskannya lebih menyeluruh di sini:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

Kutipan yang relevan:

npm menerbitkan sebagian besar file di direktori sumber Anda secara default, dan orang-orang telah menerbitkan shrinkwraps selama bertahun-tahun. Kami tidak ingin merusak kompatibilitas. Dengan --save dan shrinkwrap secara default, ada risiko besar secara tidak sengaja membuatnya masuk dan menyebar melalui registri, dan pada dasarnya membuat kemampuan kami untuk memperbarui deps dan dedupe ... null.

Jadi kami memilih nama baru. Dan kami tiba-tiba memilih nama baru. Lockfile baru pada dasarnya membagikan semua kode yang sama, format yang sama persis

Cody Brumfield
sumber