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?
sumber
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?
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 install
baca package.json
untuk membuat daftar dependensi dan gunakan package-lock.json
untuk menginformasikan versi dependensi mana yang akan diinstal. Jika ketergantungan tidak ada di package-lock.json
dalamnya akan ditambahkan olehnpm install
.
npm ci
(dinamai setelah C ontinuous I ntegration) menginstal dependensi langsung dari package-lock.json
dan menggunakan package.json
hanya 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 install
untuk 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 ci
dalam kasus ini.
Gunakan npm ci
jika 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
npm-shrinkwrap.json
danpackage-lock.json
(dalam urutan itu).node_modules
.package.json
atau package-lock.json
.
npm i packagename
) mungkin menulis package.json
untuk menambah atau memperbarui ketergantungan.npm i
) ia mungkin menulis package-lock.json
untuk mengunci versi beberapa dependensi jika belum ada dalam file ini.npm ci
package-lock.json
atau npm-shrinkwrap.json
untuk hadir.package.json
.node_modules
dan menginstal semua dependensi sekaligus.package.json
atau package-lock.json
.Saat npm ci
menghasilkan seluruh pohon dependensi dari package-lock.json
atau 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
npm install
bisa menulis ke package.json. Apakah Anda tahu apa yang bisa ditulis di sini?npm install package
bisa memodifikasi keduanyapackage-lock.json
danpackage.json
, sementaranpm install
argumen apa pun hanya akan memodifikasipackage-lock.json
npm ci
akan menghapus folder node_modules yang ada dan bergantung padapackage-lock.json
file 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.sumber
Dokumentasi yang Anda tautkan memiliki ringkasan:
sumber
Perintah-perintah ini sangat mirip dalam fungsi namun perbedaannya adalah dalam pendekatan yang diambil untuk menginstal dependensi yang ditentukan dalam Anda
package.json
danpackage-lock.json
file.npm ci
melakukan instalasi yang bersih dari semua dependensi aplikasi Anda sedangkannpm install
mungkin melewatkan beberapa instalasi jika sudah ada pada sistem. Masalah dapat muncul jika versi yang sudah diinstal pada sistem bukan yang Andapackage.json
ingin instal yaitu versi yang diinstal berbeda dari versi ' wajib '.Perbedaan lainnya adalah
npm ci
tidak pernah menyentuhpackage*.json
file Anda . Ini akan menghentikan instalasi dan menampilkan kesalahan jika versi dependensi tidak cocok denganpackage.json
danpackage-lock.json
file.Anda dapat membaca penjelasan yang jauh lebih baik dari dokumen resmi di sini .
Selain itu, Anda mungkin ingin membaca tentang kunci paket di sini .
sumber
Perlu diingat bahwa gambar docker light node seperti alpine tidak memiliki Python diinstal yang merupakan ketergantungan
node-gyp
yang digunakan olehnpm ci
.Saya pikir itu agak berpendapat bahwa untuk bisa
npm ci
berfungsi Anda harus menginstal Python sebagai ketergantungan pada build Anda.Info lebih lanjut di sini Docker dan npm - gyp ERR! tidak baik
sumber
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 install
sangat bagus untuk pengembangan dan di CI ketika Anda ingin cachenode_modules
direktori. Kapan harus menggunakan ini? Anda dapat melakukan ini jika Anda membuat paket untuk digunakan orang lain (Anda TIDAK termasuknode_modules
dalam rilis seperti itu) . Mengenai caching, berhati-hatilah, jika Anda berencana untuk mendukung versiNode.js
ingat yang berbeda yangnode_modules
mungkin harus diinstal ulang karena perbedaan antaraNode.js
persyaratan runtime. Jika Anda ingin tetap menggunakan satu versi, pertahankan versi terbaruLTS
.npm ci
harus 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 memasukkannyanode_modules
dalam rilis seperti itu) . Tetap denganLTS
versiNode.js
.Bonus: Anda dapat mencampurnya tergantung pada seberapa kompleks Anda ingin membuatnya. Pada cabang fitur di
git
Anda dapat menyimpan cachenode_modules
untuk meningkatkan produktivitas tim Anda dan pada permintaan penggabungan dan mengandalkan cabang utamanpm ci
untuk hasil deterministik.sumber