Anda mungkin memiliki sesuatu seperti:
"typescript":"~2.1.6"
di package.json
mana npm Anda memperbarui ke versi minor terbaru, dalam kasus Anda2.4.1
Sunting: Pertanyaan dari OP
Tetapi itu tidak menjelaskan mengapa "npm install" akan mengubah file kunci. Bukankah file kunci dimaksudkan untuk membuat bangunan yang dapat direproduksi? Jika demikian, terlepas dari nilai semver, masih harus menggunakan versi 2.1.6 yang sama.
Menjawab:
Ini dimaksudkan untuk mengunci pohon ketergantungan penuh Anda. Katakanlah typescript v2.4.1
membutuhkan widget ~v1.0.0
. Ketika Anda npm instal ambil widget v1.0.0
. Kemudian rekan pengembang Anda (atau CI build) melakukan instalasi npm dan mendapatkan typescript v2.4.1
tetapi widget
telah diperbarui widget v1.0.1
. Sekarang modul simpul Anda tidak sinkron. Inilah yang package-lock.json
mencegah.
Atau lebih umum:
Sebagai contoh, pertimbangkan
paket A:
{"name": "A", "version": "0.1.0", "dependencies": {"B": "<0.1.0"}}
paket B:
{"name": "B", "version": "0.0.1", "dependencies": {"C": "<0.1.0"}}
dan paket C:
{"name": "C", "version": "0.0.1"}
Jika ini adalah satu-satunya versi A, B, dan C yang tersedia di registri, maka instal normal npm A akan menginstal:
A@0.1.0 - B@0.0.1 - C@0.0.1
Namun, jika B@0.0.2 diterbitkan, maka instal baru npm A akan menginstal:
A@0.1.0 - B@0.0.2 - C@0.0.1 dengan asumsi versi baru tidak mengubah dependensi B. Tentu saja, versi B yang baru dapat mencakup versi C baru dan sejumlah dependensi baru. Jika perubahan tersebut tidak diinginkan, penulis A dapat menentukan ketergantungan pada B@0.0.1. Namun, jika penulis A dan penulis B bukan orang yang sama, tidak ada cara bagi penulis A untuk mengatakan bahwa ia tidak ingin menarik versi C yang baru diterbitkan ketika B tidak berubah sama sekali.
OP Pertanyaan 2: Jadi biarkan saya melihat apakah saya mengerti dengan benar. Apa yang Anda katakan adalah bahwa file kunci menentukan versi dependensi sekunder, tetapi masih bergantung pada pencocokan fuzzy package.json untuk menentukan dependensi tingkat atas. Apakah itu akurat?
Jawab: Tidak. Kunci-paket mengunci seluruh paket pohon, termasuk paket-paket root yang dijelaskan di package.json
. Jika typescript
dikunci di 2.4.1
dalam Anda package-lock.json
, itu harus tetap seperti itu sampai diubah. Dan katakanlah besok typescript
rilis versi 2.4.2
. Jika saya checkout cabang Anda dan menjalankan npm install
, npm akan menghormati lockfile dan menginstal 2.4.1
.
Lebih lanjut tentang package-lock.json
:
package-lock.json secara otomatis dihasilkan untuk operasi apa pun di mana npm memodifikasi pohon node_modules, atau package.json. Ini menjelaskan pohon persis yang dihasilkan, sehingga instalasi berikutnya dapat menghasilkan pohon yang identik, terlepas dari pembaruan ketergantungan menengah.
File ini dimaksudkan untuk dijadikan repositori sumber, dan melayani berbagai tujuan:
Jelaskan representasi tunggal dari pohon dependensi sehingga rekan tim, penyebaran, dan integrasi berkelanjutan dijamin untuk menginstal dependensi yang persis sama.
Menyediakan fasilitas bagi pengguna untuk "melakukan perjalanan waktu" ke keadaan sebelumnya dari node_modules tanpa harus melakukan direktori itu sendiri.
Untuk memfasilitasi visibilitas perubahan pohon yang lebih besar melalui perbedaan kontrol sumber yang dapat dibaca.
Dan optimalkan proses instalasi dengan memungkinkan npm untuk melewati resolusi metadata berulang untuk paket yang sebelumnya diinstal.
https://docs.npmjs.com/files/package-lock.json