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?
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
bukannya1.2.*
dipackage.json
file Anda .npm ci
karenanpm install
akan memperbarui package-lock.json sedangkan ci menggunakan kontennya. Hanya dengannpm 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 Andapackage.json
, atau beberapa dependensi Anda menggunakan cara itu, tetapi bagaimana Anda dapat memastikan setiap kalinpm 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, lakukannpm ci
(yang akan membaca dari file kunci, dan menginstal seluruh pohon paket)sumber
package-lock.json
file sama sekali. Itu hanya menginstal daripackage.json
seperti dulu. Untuk menggunakanpackage-lock.json
file ini, Anda harus menggunakan perintah "npm ci" yang baru, yang akan menginstal versi persis yang tercantum di dalampackage-lock.json
daripada rentang versi yang diberikan padapackage.json
.npm install
tidak membaca daripackage-lock.json
. Untuk mereproduksi, lakukan hal berikut. menggunakan package.json ini, jalankannpm install
{... "devDependencies": {"sinon": "7.2.2"}} Sekarang salin / tempelpackage.json
danpackage-lock.json
ke direktori baru. Ubahpackage.json
ke: "sinon": "^ 7.2.2" jalankannpm 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 menghapuspackage-lock.json
dan membuat ulang menggunakannpm install
. (Anda tidak ingin mengedit secara manualpackage-lock.json
). Mengubah nilai dari "versi" properti (di dekat bagian atas) daripackage.json
akan berubah sama dipackage-lock.json
atasnpm install
, tetapi menambahkan tanda sisipan untuk ketergantungan tidak akan melakukan hal yang sama untukpackage-lock.json
.package.json
sebagai sesuatu yang dapat Anda ubah secara manual, danpackage-lock.json
sebagai sesuatu yang tidak pernah Anda sentuh secara manual. Anda selalu mengontrol file KEDUA versi - terutamapackage-lock.json
. Buka kedua file, edit nama proyek secara manualpackage.json
, jalankannpm install
dan saksikan bagaimana nama proyek berubahpackage-lock.json
.license
sepertinya tidak direkam dalampackage-lock.json
.npm ci
,npm install
hanya akan menggunakan package.json, meskipun file kunci disediakanpackage-lock.json
ditulis ketika nilai numerik dalam properti seperti properti "versi", atau properti dependensi diubahpackage.json
.Jika nilai-nilai numerik ini dalam
package.json
danpackage-lock.json
cocok,package-lock.json
dibaca dari.Jika nilai-nilai numerik ini dalam
package.json
danpackage-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 perubahanpackage-lock.json
.Untuk melihat apa yang saya maksud, lakukan hal berikut. Menggunakan
package.json
tanpapackage-lock.json
, jalankannpm install
dengan:package-lock.json
sekarang akan memiliki:Sekarang salin / tempelkan kedua file ke direktori baru. Ubah
package.json
ke (hanya menambahkan tanda sisipan):lari
npm install
. Jika tidak adapackage-lock.json
file, [email protected] akan diinstal.npm install
sedang membaca daripackage-lock.json
dan menginstal 7.2.2.Sekarang ubah
package.json
ke:lari
npm install
.package-lock.json
telah ditulis untuk , dan sekarang akan menunjukkan:sumber
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.
sumber
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.
}
sumber
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.
sumber
package-lock.json: Ini berisi detail versi persis yang saat ini diinstal untuk Aplikasi Anda.
sumber