Apa perbedaan antara "npm install" dan "npm ci"?


215

Saya bekerja dengan integrasi terus menerus dan menemukan perintah npm ci .

Saya tidak tahu apa kelebihan menggunakan perintah ini untuk alur kerja saya.

Apakah ini lebih cepat? Apakah ini membuat tes lebih sulit, oke, dan sesudahnya?

Jawaban:


328

Dari dokumen npm :

Singkatnya, perbedaan utama antara menggunakan npm install dan npm ci adalah:

  • Proyek harus memiliki package-lock.json atau npm-shrinkwrap.json.
  • Jika dependensi dalam kunci paket tidak cocok dengan yang ada di package.json, npm ci akan keluar dengan kesalahan, alih-alih memperbarui kunci paket.
  • npm ci hanya dapat menginstal seluruh proyek sekaligus: dependensi individual tidak dapat ditambahkan dengan perintah ini.
  • Jika node_modules sudah ada, maka akan dihapus secara otomatis sebelum npm ci mulai menginstalnya.
  • Itu tidak akan pernah menulis ke package.json atau salah satu dari kunci-paket: instalasi pada dasarnya beku.

Pada dasarnya, npm installbaca package.jsonuntuk membuat daftar dependensi dan gunakan package-lock.jsonuntuk menginformasikan versi dependensi mana yang akan diinstal. Jika ketergantungan tidak ada di package-lock.jsondalamnya akan ditambahkan olehnpm install .

npm ci(dinamai setelah C ontinuous I ntegration) menginstal dependensi langsung dari package-lock.jsondan menggunakan package.jsonhanya untuk memvalidasi bahwa tidak ada versi yang tidak cocok. Jika ada dependensi yang hilang atau memiliki versi yang tidak kompatibel, itu akan menimbulkan kesalahan .

Gunakan npm installuntuk menambahkan dependensi baru, dan untuk memperbarui dependensi pada suatu proyek. Biasanya, Anda akan menggunakannya selama pengembangan setelah menarik perubahan yang memperbarui daftar dependensi tetapi mungkin ide yang baik untuk digunakan npm cidalam kasus ini.

Gunakan npm cijika Anda membutuhkan bangunan yang deterministik dan berulang. Misalnya selama integrasi berkelanjutan, pekerjaan otomatis, dll. Dan ketika menginstal dependensi untuk pertama kalinya, bukan npm install.

npm install

  • Menginstal paket dan semua dependensinya.
  • Ketergantungan didorong oleh npm-shrinkwrap.jsondanpackage-lock.json (dalam urutan itu).
  • tanpa argumen : menginstal dependensi dari modul lokal.
  • Dapat menginstal paket global.
  • Akan menginstal semua dependensi yang hilang di node_modules.
  • Mungkin menulis ke package.jsonatau package-lock.json.
    • Ketika digunakan dengan argumen ( npm i packagename) mungkin menulis package.jsonuntuk menambah atau memperbarui ketergantungan.
    • ketika digunakan tanpa argumen, ( npm i) ia mungkin menulis package-lock.jsonuntuk mengunci versi beberapa dependensi jika belum ada dalam file ini.

npm ci

  • Membutuhkan setidaknya npm v5.7.1 .
  • Membutuhkan package-lock.jsonatau npm-shrinkwrap.jsonuntuk hadir.
  • Melempar kesalahan jika dependensi dari kedua file ini tidak cocok package.json.
  • Menghapus node_modulesdan menginstal semua dependensi sekaligus.
  • Itu tidak pernah menulis ke package.jsonatau package-lock.json.

Algoritma

Saat npm cimenghasilkan seluruh pohon dependensi dari package-lock.jsonatau npm-shrinkwrap.json, npm install memperbarui kontennode_modules menggunakan algoritma ( sumber ) berikut:

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
Saya tidak tahu npm installbisa menulis ke package.json. Apakah Anda tahu apa yang bisa ditulis di sini?
Veve

5
baik yang mungkin agak menyesatkan ... itu akan menulis ke package.json ketika Anda menggunakannya untuk menginstal, memperbarui, atau menghapus dependensi. Saya akan membuatnya lebih jelas dalam teks, terima kasih!
lucascaro

Di mana algoritma ini didokumentasikan? Yaitu apa sumber Anda?
Yngvar Kristiansen

1
@YngvarKristiansen ada di dokumentasi npm, menambahkan tautan ke bagian spesifik untuk referensi
lucascaro

4
npm install packagebisa memodifikasi keduanya package-lock.json dan package.json , sementara npm installargumen apa pun hanya akan memodifikasipackage-lock.json
knobo

20

npm ciakan menghapus folder node_modules yang ada dan bergantung pada package-lock.jsonfile untuk menginstal versi spesifik dari setiap paket. Ini secara signifikan lebih cepat daripada instalasi npm karena melewatkan beberapa fitur. Ini instalasi keadaan bersih sangat bagus untuk pipa ci / cd dan membangun buruh pelabuhan! Anda juga menggunakannya untuk menginstal semuanya sekaligus dan bukan paket khusus.


9

Dokumentasi yang Anda tautkan memiliki ringkasan:

Singkatnya, perbedaan utama antara menggunakan npm install dan npm ci adalah:

  • Proyek harus memiliki package-lock.json atau npm-shrinkwrap.json.
  • Jika dependensi dalam kunci paket tidak cocok dengan yang ada di package.json, npm ci akan keluar dengan kesalahan, alih-alih memperbarui kunci paket.
  • npm ci hanya dapat menginstal seluruh proyek sekaligus: dependensi individual tidak dapat ditambahkan dengan perintah ini.
  • Jika node_modules sudah ada, maka akan dihapus secara otomatis sebelum npm ci mulai menginstalnya.
  • Itu tidak akan pernah menulis ke package.json atau salah satu dari kunci-paket: instalasi pada dasarnya beku.

2

Perintah-perintah ini sangat mirip dalam fungsi namun perbedaannya adalah dalam pendekatan yang diambil untuk menginstal dependensi yang ditentukan dalam Anda package.jsondanpackage-lock.json file.

npm cimelakukan instalasi yang bersih dari semua dependensi aplikasi Anda sedangkan npm installmungkin melewatkan beberapa instalasi jika sudah ada pada sistem. Masalah dapat muncul jika versi yang sudah diinstal pada sistem bukan yang Anda package.jsoningin instal yaitu versi yang diinstal berbeda dari versi ' wajib '.

Perbedaan lainnya adalah npm citidak pernah menyentuh package*.jsonfile Anda . Ini akan menghentikan instalasi dan menampilkan kesalahan jika versi dependensi tidak cocok dengan package.jsondan package-lock.jsonfile.

Anda dapat membaca penjelasan yang jauh lebih baik dari dokumen resmi di sini .

Selain itu, Anda mungkin ingin membaca tentang kunci paket di sini .


1

Perlu diingat bahwa gambar docker light node seperti alpine tidak memiliki Python diinstal yang merupakan ketergantungan node-gypyang digunakan oleh npm ci.

Saya pikir itu agak berpendapat bahwa untuk bisa npm ciberfungsi Anda harus menginstal Python sebagai ketergantungan pada build Anda.

Info lebih lanjut di sini Docker dan npm - gyp ERR! tidak baik


0

Sementara semua orang telah menjawab perbedaan teknis, tidak ada yang menjelaskan dalam situasi apa untuk menggunakan keduanya.

Anda harus menggunakannya dalam situasi yang berbeda.

npm installsangat bagus untuk pengembangan dan di CI ketika Anda ingin cache node_modulesdirektori. Kapan harus menggunakan ini? Anda dapat melakukan ini jika Anda membuat paket untuk digunakan orang lain (Anda TIDAK termasuk node_modulesdalam rilis seperti itu) . Mengenai caching, berhati-hatilah, jika Anda berencana untuk mendukung versi Node.jsingat yang berbeda yang node_modulesmungkin harus diinstal ulang karena perbedaan antara Node.jspersyaratan runtime. Jika Anda ingin tetap menggunakan satu versi, pertahankan versi terbaru LTS.

npm ciharus digunakan ketika Anda menguji dan merilis aplikasi produksi (produk akhir, tidak untuk digunakan oleh paket lain) karena penting bahwa Anda memiliki instalasi sebagai deterministik mungkin, instalasi ini akan memakan waktu lebih lama tetapi pada akhirnya akan membuat aplikasi Anda lebih dapat diandalkan (Anda memasukkannya node_modulesdalam rilis seperti itu) . Tetap dengan LTSversi Node.js.

Bonus: Anda dapat mencampurnya tergantung pada seberapa kompleks Anda ingin membuatnya. Pada cabang fitur di gitAnda dapat menyimpan cache node_modulesuntuk meningkatkan produktivitas tim Anda dan pada permintaan penggabungan dan mengandalkan cabang utama npm ciuntuk hasil deterministik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.