npm 5 dirilis hari ini dan salah satu fitur baru termasuk pemasangan deterministik dengan pembuatan package-lock.json
file.
Apakah file ini seharusnya disimpan dalam kendali sumber?
Saya berasumsi itu mirip dengan yarn.lock
dan composer.lock
, yang keduanya seharusnya disimpan dalam kontrol sumber.
git log
lebih mudah untuk ditangani.Jawaban:
Ya,
package-lock.json
dimaksudkan untuk diperiksa ke dalam kontrol sumber. Jika Anda menggunakan npm 5, Anda dapat melihat ini di baris perintah:created a lockfile as package-lock.json. You should commit this file.
Menurutnpm help package-lock.json
:sumber
package-lock.json
ke.gitignore
... itu menyebabkan saya lebih banyak masalah daripada menyelesaikannya. Itu selalu konflik ketika kita menggabungkan atau rebase, dan ketika suatu hasil gabunganpackage-lock.json
menjadi rusak di server CI, itu hanya sakit harus tetap memperbaikinya.Ya, ini dimaksudkan untuk check-in. Saya ingin menyarankan agar ia mendapatkan komit uniknya sendiri. Kami menemukan bahwa itu menambahkan banyak suara ke diff kami.
sumber
package-lock.json
file saat bekerja pada sistem SCM dengan batang dan percabangan? Saya membuat beberapa perubahan pada cabang yang perlu digabungkan ke trunk ... apakah sekarang saya harus (entah bagaimana) menyelesaikan konflik antara keduapackage-lock.json
file? Ini terasa menyakitkan.Ya kamu harus:
package-lock.json
.npm ci
bukannyanpm install
saat membangun aplikasi Anda baik pada CI Anda dan mesin pengembangan lokal AndaThe
npm ci
alur kerja membutuhkan adanyapackage-lock.json
.Kelemahan besar dari
npm install
perintah adalah perilaku tak terduga yang dapat dimutasikannyapackage-lock.json
, sedangkannpm ci
hanya menggunakan versi yang ditentukan dalam file kunci dan menghasilkan kesalahanpackage-lock.json
danpackage.json
tidak sinkronpackage-lock.json
yang hilang.Oleh karena itu, berjalan
npm install
secara lokal, esp. di tim yang lebih besar dengan banyak pengembang, dapat menyebabkan banyak konflik di dalampackage-lock.json
dan pengembang memutuskan untuk sepenuhnya menghapuspackage-lock.json
.Namun ada kasus penggunaan yang kuat untuk bisa percaya bahwa ketergantungan proyek diselesaikan berulang-ulang dengan cara yang dapat diandalkan di berbagai mesin.
Dari
package-lock.json
Anda mendapatkan hal itu: suatu kondisi yang diketahui bekerja.Di masa lalu, saya punya proyek tanpa
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
file yang membangun suatu hari akan gagal karena ketergantungan acak mendapat pembaruan yang melanggar.Masalah itu sulit untuk dipecahkan karena terkadang Anda harus menebak versi terakhir yang berfungsi.
Jika Anda ingin menambahkan ketergantungan baru, Anda masih menjalankan
npm install {dependency}
. Jika Anda ingin meng-upgrade, menggunakan baiknpm update {dependency}
ataunpm install ${dependendency}@{version}
dan komit berubahpackage-lock.json
.Jika pemutakhiran gagal, Anda dapat kembali ke pekerjaan yang terakhir diketahui
package-lock.json
.Untuk mengutip doc NPM :
Dan dalam hal perbedaan antara
npm ci
vsnpm install
:Catatan: Saya mengirim jawaban serupa di sini
sumber
whose build would fail one day because a random dependency got a breaking update
masalah. Meskipun itu meninggalkan kemungkinan ketergantungan anak karena masalah yang sama.Ya, praktik terbaik adalah check-in (YA, LIHAT-IN)
Saya setuju bahwa itu akan menyebabkan banyak kebisingan atau konflik ketika melihat diff. Tetapi manfaatnya adalah:
^1.2.3
dipackage.json
, tetapi bagaimana Anda bisa memastikan setiap kalinpm install
akan mengambil versi yang sama di mesin dev Anda dan di server build, terutama paket dependensi tidak langsung? Nah,package-lock.json
akan memastikan itu. (Dengan bantuannpm ci
yang menginstal paket berdasarkan file kunci)npm audit fix
(saya pikir fitur audit berasal dari npm versi 6).sumber
npm ci
. Orang-orang sering menyebutkan bahwa apackage-lock.json
mengijinkan instalasi paket yang deterministik tetapi hampir tidak pernah menyebutkan perintah yang memfasilitasi perilaku ini! Banyak orang mungkin salah mengiranpm install
menginstal persis apa yang ada dalam file kunci ...npm ci
. Pengembang tim / pemimpin Anda dapat memutuskan kapan akan memperbarui. Jika semua orang melakukannya secara sewenang-wenang, tidak ada gunanya, dan itu hanya membuat suara di repo Anda. Dokumentasi NPM harus membuatnya lebih jelas. Saya pikir sebagian besar pengembang hanya bingung dengan fitur ini.Saya tidak melakukan file ini di proyek saya. Apa gunanya ?
Meskipun benar bahwa saya tidak pernah menggunakan ^ dalam paket saya. Json for libs karena saya memiliki pengalaman buruk dengannya.
sumber
package-lock.json
. Beberapa repo mungkin tidak memerlukan manfaat yang berasal dari memilikinya, dan mungkin lebih suka tidak memiliki konten yang dibuat secara otomatis di sumbernya.Untuk orang-orang yang mengeluh tentang kebisingan ketika melakukan git diff:
Apa yang saya lakukan adalah menggunakan alias:
Untuk mengabaikan package-lock.json di diffs untuk seluruh repositori (semua orang menggunakannya), Anda dapat menambahkan ini ke
.gitattributes
:Ini akan menghasilkan perbedaan yang menunjukkan "File biner a / package-lock.json dan b / package-lock.json berbeda setiap kali file kunci paket diubah. Selain itu, beberapa layanan Git (terutama GitLab, tetapi bukan GitHub) juga akan mengecualikan file-file ini (tidak ada lagi baris 10k berubah!) dari diff saat melihat online ketika melakukan ini.
sumber
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
di .bashrc saya, bukan alias.Ya, Anda dapat melakukan file ini. Dari dokumen resmi npm :
sumber
npm ci
untuk menginstal dari package-lock.jsonNonaktifkan package-lock.json secara global
ketikkan yang berikut ini di terminal Anda:
ini benar-benar bekerja untuk saya seperti sulap
sumber
~/.npmrc
(setidaknya di makro saya) dengan kontenpackage-lock=false
dan hal yang sama dapat dilakukan dalam proyek spesifik bersamanode_modules/
(misalnyaecho 'package-lock=false' >> .npmrc
Ya, ini adalah praktik standar untuk melakukan package-lock.json
Alasan utama untuk melakukan package-lock.json adalah bahwa semua orang dalam proyek ini pada versi paket yang sama.
Pro: -
Kekurangan: -
Sunting: - instalasi npm tidak akan memastikan bahwa semua orang dalam proyek ini pada versi paket yang sama. npm ci akan membantu dengan ini.
sumber
npm ci
bukannpm install
.Penggunaan npm saya adalah untuk menghasilkan css / js minified / uglified dan untuk menghasilkan javascript yang dibutuhkan dalam halaman yang dilayani oleh aplikasi Django. Dalam aplikasi saya, Javascript berjalan pada halaman untuk membuat animasi, beberapa kali melakukan panggilan ajax, bekerja dalam kerangka VUE dan / atau bekerja dengan css. Jika package-lock.json memiliki kontrol utama atas apa yang ada di package.json, maka mungkin perlu ada satu versi file ini. Dalam pengalaman saya, itu tidak mempengaruhi apa yang diinstal oleh npm install, atau jika ya, itu tidak sampai saat ini mempengaruhi aplikasi yang saya sebarkan dengan sepengetahuan saya. Saya tidak menggunakan mongodb atau aplikasi lain yang biasanya merupakan klien tipis.
Saya menghapus package-lock.json dari repo karena npm install menghasilkan file ini, dan install npm adalah bagian dari proses penyebaran pada setiap server yang menjalankan aplikasi. Kontrol versi node dan npm dilakukan secara manual pada setiap server, tetapi saya berhati-hati karena keduanya sama.
Ketika
npm install
dijalankan di server, itu mengubah package-lock.json, dan jika ada perubahan pada file yang direkam oleh repo di server, penyebaran berikutnya WONT memungkinkan Anda untuk menarik perubahan baru dari asal. Itu adalah Anda tidak dapat menyebarkan karena tarikan akan menimpa perubahan yang telah dibuat untuk package-lock.json.Anda bahkan tidak dapat menimpa paket-lock.json yang dibuat secara lokal dengan apa yang ada di repo (reset master asal keras), karena npm akan mengeluh kapan pun Anda mengeluarkan perintah jika package-lock.json tidak mencerminkan apa yang ada di dalam node_modules karena npm instal, sehingga melanggar penyebaran. Sekarang jika ini menunjukkan bahwa versi yang sedikit berbeda telah diinstal di node_modules, sekali lagi itu tidak pernah menyebabkan masalah bagi saya.
Jika node_modules tidak ada di repo Anda (dan seharusnya tidak), maka package-lock.json harus diabaikan.
Jika saya kehilangan sesuatu, perbaiki saya di komentar, tetapi poin bahwa versi diambil dari file ini tidak masuk akal. File package.json memiliki nomor versi di dalamnya, dan saya berasumsi file ini adalah yang digunakan untuk membangun paket ketika instalasi npm terjadi, seperti ketika saya menghapusnya, instal npm mengeluh sebagai berikut:
dan build gagal, namun ketika menginstal node_modules atau menerapkan npm untuk membangun js / css, tidak ada keluhan dibuat jika saya menghapus package-lock.json
sumber