Saya baru saja ditingkatkan ke npm @ 5 . Saya sekarang memiliki file package-lock.json dengan semuanya dari package.json . Saya berharap bahwa, ketika saya menjalankan npm install
bahwa versi dependensi akan ditarik dari file kunci untuk menentukan apa yang harus diinstal di direktori node_modules saya . Apa yang aneh adalah bahwa itu akhirnya memodifikasi dan menulis ulang file package-lock.json saya .
Misalnya, file kunci memiliki naskah yang ditentukan untuk berada di versi 2.1.6 . Kemudian, setelah npm install
perintah, versi diubah menjadi 2.4.1 . Itu tampaknya mengalahkan seluruh tujuan file kunci.
Apa yang saya lewatkan? Bagaimana saya mendapatkan npm untuk benar-benar menghargai file kunci saya?
node.js
npm
npm-install
package-lock.json
Viper Bailey
sumber
sumber
package-lock.json
mendapatkan regenerasi ketika saya menjalankannpm install
. Baunya seperti bug npm. Apakah Anda menggunakan registri Anda sendiri?--no-save
mencegah penguncian lockfile, tetapi itu tidak memengaruhi peningkatan ketergantungan tingkat pertama yang konyol yang disebutkan OP.Jawaban:
Pembaruan 3: Seperti jawaban lain tunjukkan juga,
npm ci
perintah diperkenalkan di npm 5.7.0 sebagai cara tambahan untuk mencapai build yang cepat dan dapat direproduksi dalam konteks CI. Lihat dokumentasi dan blog npm untuk informasi lebih lanjut.Pembaruan 2: Masalah untuk memperbarui dan memperjelas dokumentasi adalah masalah GitHub # 18103 .
Pembaruan 1: Perilaku yang dijelaskan di bawah diperbaiki pada npm 5.4.2: perilaku yang dimaksud saat ini diuraikan dalam masalah GitHub # 17979 .
Jawaban asli: Perilaku
package-lock.json
diubah dalam npm 5.1.0 seperti yang dibahas dalam edisi # 16866 . Perilaku yang Anda amati tampaknya dimaksudkan oleh npm pada versi 5.1.0.Itu berarti
package.json
dapat menimpapackage-lock.json
kapan pun versi yang lebih baru ditemukan untuk dependensi dipackage.json
. Jika Anda ingin menyematkan dependensi secara efektif, Anda sekarang harus menentukan versi tanpa awalan, misalnya, Anda harus menuliskannya sebagai1.2.0
ganti~1.2.0
atau^1.2.0
. Maka kombinasi daripackage.json
danpackage-lock.json
akan menghasilkan membangun direproduksi. Agar lebih jelas:package-lock.json
sendirian tidak lagi mengunci dependensi level root!Apakah keputusan desain ini baik atau tidak dapat diperdebatkan, ada diskusi berkelanjutan yang dihasilkan dari kebingungan tentang GitHub ini dalam edisi # 17979 . (Di mata saya itu adalah keputusan yang dipertanyakan; setidaknya nama
lock
itu tidak berlaku lagi.)Satu lagi catatan tambahan: ada juga batasan untuk pendaftar yang tidak mendukung paket yang tidak dapat diubah, seperti ketika Anda menarik paket langsung dari GitHub dan bukannya npmjs.org. Lihat dokumentasi kunci paket ini untuk penjelasan lebih lanjut.
sumber
npm update
itu? : o Saya memiliki perasaan yang sama dengannpm install
update deps, tapi saya tidak ingin mempercayainya .. tapi sepertinya itu benar sekali .. Lagi pula masih ada opsi untuk digunakannpm shrinkwrap
untuk mengunci deps, tapi pasti nama paket-kunci salah karena tidak membeku, atau mengunci dependensi ..Saya telah menemukan bahwa akan ada versi baru npm 5.7.1 dengan perintah baru
npm ci
, yang akan menginstal daripackage-lock.json
sajasumber
npm install
" sebelum menjalankan perintahnpm ci
dalam proyek itu. Tidaknpm install
menimpa file package-lock.json?npm
hanya mengubah file kunci jika perlu untuk melakukannya, untuk memenuhi spesifikasi dalam paket.json . Jadi jika paket digunakan untuk mengatakanthatpackage: 1
, dan mengunci mengatakan..: 1.0.4
, dev dapat mengedit untuk mengatakanthatpackage: 2
- dan itu akan memaksa file kunci untuk berubah, karena1.0.4
tidak kompatibel dengan kisaran yang baru ditentukan. Jika tidak berubahpackages.json
, akan tetap terkunci pada versi yang tepat, hingga menghapus file kunci. [Jika tidak tetap terkunci, dan tidak mengubahGunakan yang baru diperkenalkan
Memperkenalkan
npm ci
untuk pembuatan yang lebih cepat dan lebih andalsumber
npm ci
, dan hanya menggunakannpm install
jika memperbarui atau menginstal paket baru.node_modules
direktori yang ada dan membangun kembali secara lokal, bahkan jika itu adalah symlink kosong tetapi penting. :(npm ci
saya berharap mereka akan sangat enggan untuk memperkenalkan apa pun yang dapat mengurangi kinerja untuk kasus penggunaan yang tidak biasa. Anda mungkin ingin memeriksa pnpm.js.org meskipun itu menggunakan tautan keras untuk mengurangi penggunaan disk.Jawaban singkat:
npm install
menghormati package-lock.json hanya jika memenuhi persyaratan package.json.npm ci
.Berikut adalah skenario yang mungkin menjelaskan hal-hal (Diverifikasi dengan NPM 6.3.0)
Anda mendeklarasikan dependensi dalam package.json seperti:
Kemudian Anda lakukan,
npm install
yang akan menghasilkan package-lock.json dengan:Beberapa hari kemudian, versi minor "depA" yang lebih baru dirilis, katakan "1.1.0", kemudian yang berikut ini berlaku:
Selanjutnya, Anda memperbarui paket Anda secara manual ke:
Kemudian jalankan kembali:
sumber
npm install
akan menggunakan versi terkunci daripackage-lock.json
kecuali itu tidak memenuhipackage.json
dalam hal itu menginstal package.json dan membangun kembali package-lock.json sesuai. Jika Anda mengubah Andapackage.json
sedemikian rupa sehingga kunci-paket yang ada masih memenuhi pembaruanpackage.json
itu akan terus menggunakannyapackage-lock
npm install
tidak melakukan apa pun, terlepas dari package-lock.json. Kami harus memperbarui paket secara eksplisit bahkan ketika ada pembaruan yang tersedia yang cocok dengan semver yang ditentukan dalam package.json. Setidaknya itu sudah pengalaman saya selama bertahun-tahun.node_modules
memenuhi kisaran dipackage.json
, dan tidak adapackage-lock.json
file, npm tidak akan memperbarui modul saat berjalannpm install
. Saya kira itu baik-baik saja karena Anda dapat menggunakannpm update
(ataunpm-check
untuk yang terbaru) untuk memperbarui dependensi, dan perilaku ini lebih cepat untuk kasus seseorang hanya menambahkan satu entripackage.json
, dan tidak ingin paket yang tidak terkait memperbarui diri ke yang terbaru yang memenuhi sem-ver jarak.Gunakan
npm ci
perintah sebagai gantinpm install
."ci" adalah singkatan dari "continuous continuous".
Ini akan menginstal dependensi proyek berdasarkan pada file package-lock.json alih-alih dependensi file package.json yang ringan.
Ini akan menghasilkan build identik dengan rekan tim Anda dan juga jauh lebih cepat.
Anda dapat membaca lebih lanjut tentang hal ini di posting blog ini: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-r reliable
sumber
ci
merujuk pada "integrasi berkelanjutan", sebagaimana disebutkan dalam dokumen dan posting blog yang mengumumkan perintah: blog.npmjs.org/post/171556855892/...node_modules
folder dan membuatnya kembali dari awal. Apakah ini jauh lebih cepat? Apakahnpm install
menghapusnode_modules
folder juga?npm install
harus menyelesaikan semua dependensi paket ketika dijalankan.npm ci
hanyalah daftar belanjaan "dapatkan modul ini dengan tepat"Di masa depan, Anda akan dapat menggunakan
--from-lock-file
bendera (atau serupa) untuk menginstal hanya daripackage-lock.json
tanpa mengubahnya.Ini akan berguna untuk CI, dll. Lingkungan di mana bangunan yang direproduksi penting.
Lihat https://github.com/npm/npm/issues/18286 untuk melacak fitur tersebut.
sumber
npm ci
yang juga menangani pertanyaan Anda.Tampaknya masalah ini diperbaiki di npm v5.4.2
https://github.com/npm/npm/issues/17979
(Gulir ke bawah ke komentar terakhir di utas)
Memperbarui
Sebenarnya diperbaiki dalam 5.6.0. Ada bug lintas platform di 5.4.2 yang menyebabkan masalah masih terjadi.
https://github.com/npm/npm/issues/18712
Perbarui 2
Lihat jawaban saya di sini: https://stackoverflow.com/a/53680257/1611058
npm ci
adalah perintah yang harus Anda gunakan saat menginstal proyek yang ada sekarang.sumber
npm i
. Sebagai contoh, modulfsevents
dihapus ketika sayanpm i
pada mesin yang tidak mendukungfsevents
dan kemudian modul ditambahkan kembali ketika satunpm i
lagi pada mesin yang tidak.fsevents
penurunan yang samapackage-lock.json
dengan saya[email protected]
saat berkolaborasi dengan kontributor Mac OS X. Jika Anda belum membuka masalah, saya akan melakukannya.Anda mungkin memiliki sesuatu seperti:
di
package.json
mana npm Anda memperbarui ke versi minor terbaru, dalam kasus Anda2.4.1
Lebih lanjut tentang
package-lock.json
: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:
https://docs.npmjs.com/files/package-lock.json
sumber
package-lock.json
ditarik ke bawah dan kemudian kami jalankannpm install
, tetapipackage-lock.json
file tersebut dimodifikasi dan kami harus melakukan reset sebelum kami dapat menarik perubahan berikutnya.Mungkin Anda harus menggunakan sesuatu seperti ini
Alih-alih menggunakan
npm install
jika Anda tidak ingin mengubah versi paket Anda.Menurut dokumentasi resmi, keduanya
npm install
dannpm ci
menginstal dependensi yang diperlukan untuk proyek.sumber
Ada masalah terbuka untuk ini di halaman github mereka: https://github.com/npm/npm/issues/18712
Masalah ini paling parah ketika pengembang menggunakan sistem operasi yang berbeda.
sumber
EDIT: nama "kunci" adalah yang rumit, NPM-nya berusaha mengejar ketinggalan dengan Benang. Ini bukan file yang terkunci.
package.json
adalah file yang diperbaiki pengguna, yang pernah "diinstal" akan menghasilkan pohon folder node_modules dan kemudian pohon itu akan ditulispackage-lock.json
. Jadi Anda lihat, ini sebaliknya - versi ketergantungan akan ditarikpackage.json
seperti biasa, danpackage-lock.json
harus dipanggilpackage-tree.json
(Semoga ini membuat jawaban saya lebih jelas, setelah banyak downvotes)
Sebuah jawaban sederhana:
package.json
memiliki dependensi Anda seperti biasa, sementarapackage-lock.json
"pohon node_modules tepat, dan lebih penting direproduksi" (diambil dari npm docs sendiri ).Adapun nama yang rumit, NPM-nya berusaha mengejar ketinggalan dengan Benang.
sumber