Apa peran dari paket-lock.json?

291

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?

SecretCastle
sumber

Jawaban:

291

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. "

Edit

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.

Mat
sumber
78
Jika memiliki versi dependensi yang tepat sangat dicari, mengapa tidak menegakkan menentukan versi yang tepat dalam package.json dan melupakan file package-lock.json?
jrahhali
15
@jrahhali - telah mengubah jawaban saya berdasarkan pertanyaan Anda.
Matt
1
Bagaimana pohon ketergantungan ini dari pacakge.json.lock diterapkan untuk pengembang lain? Secara otomatis?
Steve K
40
Harap perhatikan bahwa jawaban ini tidak lagi benar ! The package-lock.jsonfile 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.jsonfile Anda .
Christian
5
Anda harus menambahkan referensi ke npm cikarena npm installakan memperbarui package-lock.json sedangkan ci menggunakan kontennya. Hanya dengan npm ciAnda akan mendapatkan build yang kuat berulang.
k0pernikus
34

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.3di Anda package.json, atau beberapa dependensi Anda menggunakan cara itu, tetapi bagaimana Anda dapat memastikan setiap kali npm installakan mengambil versi yang sama di mesin dev Anda dan di server build? package-lock.json akan memastikan itu.

npm installakan 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)

Xin
sumber
9
Perhatikan bahwa ini agak ketinggalan jaman sekarang. Dalam 5.1.0 dan seterusnya, "npm install" tidak membaca dari package-lock.jsonfile sama sekali. Itu hanya menginstal dari package.jsonseperti dulu. Untuk menggunakan package-lock.jsonfile ini, Anda harus menggunakan perintah "npm ci" yang baru, yang akan menginstal versi persis yang tercantum di dalam package-lock.jsondaripada rentang versi yang diberikan pada package.json.
Venryx
5
Saya khawatir Venryx salah. 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.jsondan package-lock.jsonke direktori baru. Ubah package.jsonke: "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.
zumafra
2
Dan bukan hanya itu, tetapi jika Anda ingin melakukan sesuatu seperti menambahkan tanda sisipan ^ package-lock.json, satu-satunya cara yang masuk akal untuk melakukannya adalah menghapus package-lock.jsondan 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.jsonakan berubah sama di package-lock.jsonatas npm install, tetapi menambahkan tanda sisipan untuk ketergantungan tidak akan melakukan hal yang sama untuk package-lock.json.
zumafra
1
Pikirkan package.jsonsebagai sesuatu yang dapat Anda ubah secara manual, dan package-lock.jsonsebagai 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 installdan saksikan bagaimana nama proyek berubah package-lock.json. licensesepertinya tidak direkam dalam package-lock.json.
zumafra
2
File @zumafra package-lock.json akan digunakan saat melakukan npm ci, npm installhanya akan menggunakan package.json, meskipun file kunci disediakan
Xin
13

package-lock.jsonditulis ketika nilai numerik dalam properti seperti properti "versi", atau properti dependensi diubah package.json.

Jika nilai-nilai numerik ini dalam package.jsondan package-lock.jsoncocok, package-lock.jsondibaca dari.

Jika nilai-nilai numerik ini dalam package.jsondan package-lock.jsontidak cocok, package-lock.jsondituliskan 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.jsontanpa package-lock.json, jalankan npm installdengan:

{
  "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.jsonke (hanya menambahkan tanda sisipan):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

lari npm install. Jika tidak ada package-lock.jsonfile, [email protected] akan diinstal. npm installsedang membaca dari package-lock.json dan menginstal 7.2.2.

Sekarang ubah package.jsonke:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

lari npm install. package-lock.jsontelah ditulis untuk , dan sekarang akan menunjukkan:

"sinon": {
  "version": "^7.3.0",
zumafra
sumber
7

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.

nflaig
sumber
4

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"
  }
},

}

DIBYA RANJAN TRIPATHY
sumber
2

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.

user_ahmed
sumber
1
jadi apa yang terjadi jika saya mendapat konflik dengan file ini?
Oliver Watkins
0

package-lock.json: Ini berisi detail versi persis yang saat ini diinstal untuk Aplikasi Anda.

Shubham Srivastava
sumber
1
Hai, dan selamat datang. Pertanyaan ini sudah dijawab. Anda harus memverifikasi apakah pertanyaan telah ditandai sebagai dijawab melihat apakah ada jawaban yang memiliki tanda centang hijau di depannya.
Néstor