npm @ 5 telah dipublikasikan, ia memiliki file fitur baru paket-lock.json (setelah npm install
) yang membingungkan saya. Saya ingin tahu, apa efek dari file ini?
npm @ 5 telah dipublikasikan, ia memiliki file fitur baru paket-lock.json (setelah npm install
) yang membingungkan saya. Saya ingin tahu, apa efek dari file ini?
Jawaban:
Ia menyimpan pohon dependensi yang tepat dan berversi daripada menggunakan versi yang berkilau bintangnya seperti package.json itu sendiri (mis. 1.0. *). Ini berarti Anda dapat menjamin dependensi untuk pengembang lain atau rilis prod, dll. Ini juga memiliki mekanisme untuk mengunci pohon tetapi umumnya akan diperbarui jika package.json berubah.
Dari dokumen npm :
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 satu representasi 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 melewatkan resolusi metadata berulang untuk paket yang sebelumnya diinstal. "
Untuk menjawab pertanyaan jrahhali di bawah ini tentang hanya menggunakan package.json dengan nomor versi yang tepat. Ingatlah bahwa package.json Anda hanya berisi dependensi langsung Anda, bukan dependensi dependensi Anda (kadang-kadang disebut dependensi bersarang). Ini berarti dengan paket standar. Json Anda tidak dapat mengontrol versi dependensi bersarang itu, merujuknya langsung atau sebagai dependensi rekan tidak akan membantu karena Anda juga tidak mengontrol toleransi versi yang ditentukan dependensi langsung Anda untuk dependensi bertingkat ini. .
Bahkan jika Anda mengunci versi dependensi langsung Anda, Anda tidak dapat 100% menjamin bahwa pohon dependensi penuh Anda akan sama setiap waktu. Kedua, Anda mungkin ingin mengizinkan perubahan yang tidak melanggar (berdasarkan versi semantik) dari dependensi langsung Anda yang memberi Anda lebih sedikit kendali atas dependensi bersarang plus Anda lagi tidak dapat menjamin bahwa dependensi langsung Anda tidak akan pada suatu titik melanggar aturan versi semantik diri.
Solusi untuk semua ini adalah file kunci yang seperti dijelaskan di atas mengunci dalam versi pohon ketergantungan penuh. Ini memungkinkan Anda untuk menjamin pohon dependensi Anda untuk pengembang lain atau untuk rilis sementara masih memungkinkan pengujian versi ketergantungan baru (langsung atau tidak langsung) menggunakan paket standar Anda. Json.
NB. Menyusut json bungkus sebelumnya melakukan cukup banyak hal yang sama tetapi file kunci menamainya sehingga fungsinya lebih jelas. Jika sudah ada file bungkus menyusut dalam proyek maka ini akan digunakan sebagai pengganti file kunci.
package-lock.json
file diperbarui setiap kali Anda memanggil NPM menginstal sejak NPM 5.1. (perubahan dalam github.com/npm/npm/issues/16866 , contoh di github.com/npm/npm/issues/17979 ) Karena itu tidak dapat lagi digunakan untuk mengatur versi yang sama untuk semua pengembang , kecuali Anda menentukan versi yang tepat Suka1.2.3
bukannya 1.2.*
di package.json
file Anda .
npm ci
karena npm install
akan memperbarui package-lock.json sedangkan ci menggunakan kontennya. Hanya dengan npm ci
Anda akan mendapatkan build yang kuat berulang.
Ini merupakan peningkatan yang sangat penting untuk npm: menjamin versi yang persis sama dari setiap paket .
Bagaimana memastikan proyek Anda dibangun dengan paket yang sama di lingkungan yang berbeda dalam waktu yang berbeda? Katakanlah, Anda dapat menggunakan ^1.2.3
di Anda package.json
, atau beberapa dependensi Anda menggunakan cara itu, tetapi bagaimana Anda dapat memastikan setiap kali npm install
akan mengambil versi yang sama di mesin dev Anda dan di server build? package-lock.json akan memastikan itu.
npm install
akan menghasilkan ulang file kunci, ketika di build server atau server deployment, lakukan npm ci
(yang akan membaca dari file kunci, dan menginstal seluruh pohon paket)
package-lock.json
file sama sekali. Itu hanya menginstal dari package.json
seperti dulu. Untuk menggunakan package-lock.json
file ini, Anda harus menggunakan perintah "npm ci" yang baru, yang akan menginstal versi persis yang tercantum di dalam package-lock.json
daripada rentang versi yang diberikan pada package.json
.
npm install
tidak membaca dari package-lock.json
. Untuk mereproduksi, lakukan hal berikut. menggunakan package.json ini, jalankan npm install
{... "devDependencies": {"sinon": "7.2.2"}} Sekarang salin / tempel package.json
dan package-lock.json
ke direktori baru. Ubah package.json
ke: "sinon": "^ 7.2.2" jalankan npm install
. npm membaca dari package-lock.json dan menginstal 7.2.2 bukannya 7.3.0. Tanpa package-lock.json, 7.3.0 akan diinstal.
package-lock.json
, satu-satunya cara yang masuk akal untuk melakukannya adalah menghapus package-lock.json
dan membuat ulang menggunakan npm install
. (Anda tidak ingin mengedit secara manual package-lock.json
). Mengubah nilai dari "versi" properti (di dekat bagian atas) dari package.json
akan berubah sama di package-lock.json
atas npm install
, tetapi menambahkan tanda sisipan untuk ketergantungan tidak akan melakukan hal yang sama untuk package-lock.json
.
package.json
sebagai sesuatu yang dapat Anda ubah secara manual, dan package-lock.json
sebagai sesuatu yang tidak pernah Anda sentuh secara manual. Anda selalu mengontrol file KEDUA versi - terutama package-lock.json
. Buka kedua file, edit nama proyek secara manual package.json
, jalankan npm install
dan saksikan bagaimana nama proyek berubah package-lock.json
. license
sepertinya tidak direkam dalam package-lock.json
.
npm ci
, npm install
hanya akan menggunakan package.json, meskipun file kunci disediakan
package-lock.json
ditulis ketika nilai numerik dalam properti seperti properti "versi", atau properti dependensi diubah package.json
.
Jika nilai-nilai numerik ini dalam package.json
dan package-lock.json
cocok, package-lock.json
dibaca dari.
Jika nilai-nilai numerik ini dalam package.json
dan package-lock.json
tidak cocok, package-lock.json
dituliskan dengan nilai-nilai baru, dan pengubah baru seperti tanda sisipan dan tilde jika mereka hadir. Tetapi angka itulah yang memicu perubahan package-lock.json
.
Untuk melihat apa yang saya maksud, lakukan hal berikut. Menggunakan package.json
tanpa package-lock.json
, jalankan npm install
dengan:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "7.2.2"
}
}
package-lock.json
sekarang akan memiliki:
"sinon": {
"version": "7.2.2",
Sekarang salin / tempelkan kedua file ke direktori baru. Ubah package.json
ke (hanya menambahkan tanda sisipan):
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.2.2"
}
}
lari npm install
. Jika tidak ada package-lock.json
file, sinon@7.3.0 akan diinstal. npm install
sedang membaca dari package-lock.json
dan menginstal 7.2.2.
Sekarang ubah package.json
ke:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.3.0"
}
}
lari npm install
. package-lock.json
telah ditulis untuk , dan sekarang akan menunjukkan:
"sinon": {
"version": "^7.3.0",
Satu hal penting untuk disebutkan juga adalah peningkatan keamanan yang datang dengan file kunci paket. Karena ia menyimpan semua hash dari paket-paket tersebut jika seseorang merusak registri npm publik dan mengubah kode sumber suatu paket tanpa mengubah versi paket itu sendiri, ia akan dideteksi oleh file kunci-paket.
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.
Ini menggambarkan representasi tunggal dari pohon dependensi sehingga rekan tim, penyebaran, dan integrasi berkelanjutan dijamin untuk menginstal dependensi yang persis sama. Ini berisi properti berikut.
{
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
"integrity": "sha512-2zi6S9tPlk52vyqNFg==",
"dev": true,
"requires": {
"@angular-devkit/core": "7.1.4",
"rxjs": "6.3.3"
}
},
}
File ini secara otomatis dibuat dan digunakan oleh npm untuk melacak instalasi paket Anda dan untuk mengelola keadaan dan riwayat dependensi proyek Anda dengan lebih baik. Anda tidak boleh mengubah konten file ini.
package-lock.json: Ini berisi detail versi persis yang saat ini diinstal untuk Aplikasi Anda.