Haruskah saya melakukan file yarn.lock dan package-lock.json?

118

Kami menggunakan benang untuk semua instalasi pkg deterministik kami tetapi tidak mencegah pengguna menggunakan npm - Saya menduga memiliki kedua file ini akan menyebabkan masalah. Haruskah ada yang ditambahkan ke direktori .gitignore Anda?

Artimus
sumber
2
Kemungkinan duplikat dari Haruskah saya memasukkan file yarn.lock dan untuk apa itu?
Aurora0001

Jawaban:

148

Selalu lakukan file kunci ketergantungan secara umum

Seperti yang dibahas di tempat lain, file kunci ketergantungan, yang didukung oleh banyak sistem manajemen paket (misalnya: komposer dan bundler ), harus terikat pada basis kode dalam proyek akhir rantai - sehingga setiap individu yang mencoba menjalankan proyek itu melakukan jadi dengan persis set dependensi yang diuji.

Tidak jelas apakah file kunci harus selalu dimasukkan ke dalam paket yang dimaksudkan untuk disertakan dalam proyek lain (di mana dependensi yang lebih longgar diinginkan). Namun, Yarn dan NPM (seperti yang dicakup oleh @Cyrille) secara cerdas mengabaikan yarn.lockdan package-lock.jsonmasing - masing jika diperlukan, sehingga aman untuk selalu melakukan lockfile ini.

Jadi, Anda harus selalu melakukan setidaknya satu yarn.lockataupackage-lock.json bergantung pada pengelola paket yang Anda gunakan.

Haruskah Anda menggunakan yarn.lock dan package-lock.json?

Saat ini kami memiliki dua sistem manajemen paket yang berbeda, yang keduanya menginstal set yang sama dependensi dari package.json, tetapi yang menghasilkan dan dibaca dari dua lockfiles yang berbeda. NPM 5 menghasilkan package-lock.json, sedangkan Yarn menghasilkanyarn.lock .

Jika Anda berkomitmen package-lock.jsonmaka Anda membangun dukungan untuk orang yang menginstal dependensi Anda dengan NPM 5. Jika Anda berkomitmen yarn.lock, Anda membangun dukungan untuk orang yang menginstal dependensi dengan Yarn.

Apakah Anda memilih untuk berkomitmen yarn.lockatau package-lock.jsonkeduanya bergantung pada apakah mereka yang mengembangkan proyek Anda hanya menggunakan Yarn atau NPM 5 atau keduanya. Jika proyek Anda open-source, hal yang paling ramah komunitas untuk dilakukan mungkin adalah berkomitmen pada keduanya dan memiliki proses otomatis untuk memastikan yarn.lockdan package-lock.jsonselalu tetap sinkron.

Update: Benang sekarang telah memperkenalkan sebuah importperintah yang akan menghasilkan yarn.lockfile dari package-lock.jsonberkas. Ini bisa berguna untuk menjaga kedua file tetap sinkron. (Terima kasih @weish)


Masalah ini dibahas panjang lebar pada proyek Benang di:

Keduanya sekarang sudah ditutup.

Robin Winslow
sumber
1
Jawaban yang bagus. Namun, terkait poin Anda: "Hal teraman untuk dilakukan adalah membuat dan mengikat keduanya setiap kali dependensi Anda berubah." Saya tidak yakin mengapa ini menjadi hal yang "paling aman" untuk dilakukan. Seperti yang Anda sebutkan, sangat mungkin bahwa "kedua file mungkin tidak sinkron." Jawaban @ crimbo menjelaskan masalah ini lebih detail.
TachyonVortex
Saya pikir ini mungkin perbedaan dalam hal apakah Anda dapat mengontrol semua orang yang menjalankan proyek Anda. Jika Anda memiliki tim, tentu, standarisasi pada Yarn dan gunakan yarn.lock. Tetapi jika itu adalah proyek sumber terbuka (seperti semua milik kami) orang mungkin menggunakan NPM pada proyek Anda, meskipun Anda menggunakan Yarn secara internal. Jadi, hal teraman yang ideal untuk dilakukan adalah menggunakan sistem otomatis untuk memastikan yarn.lock dan package-lock.json akan tetap sinkron. Dan juga menekan Yarn untuk beralih ke package-lock.json.
Robin Winslow
1
yarn importdiperkenalkan pada 2018. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
lemah
18

Anda harus mengkomit 1 file kunci pohon ketergantungan, tetapi Anda tidak boleh mengkomit keduanya. Ini juga membutuhkan standarisasi pada benang atau npm (tidak keduanya) untuk membangun + mengembangkan proyek.

Berikut artikel benang tentang mengapa yarn.lock harus dilakukan, jika Anda melakukan standarisasi pada benang.

Jika Anda memasukkan kedua yarn.lockfile tersebut, DANpackage-lock.json file file tersebut ada banyak cara agar 2 file dapat menyediakan pohon ketergantungan yang berbeda (bahkan jika algoritma resolusi pohon benang dan npm identik), dan tidak sepele untuk memastikan bahwa mereka menyediakan jawaban yang sama. Karena tidak sepele, tidak mungkin pohon dependensi yang sama akan dipertahankan di kedua file, dan Anda tidak menginginkan perilaku yang berbeda bergantung pada apakah build dilakukan menggunakan benang atau npm.

Jika dan ketika benang beralih dari menggunakan yarn.lockke package-lock.json( masalah di sini ), maka pilihan file kunci untuk komit menjadi mudah, dan kita tidak perlu lagi khawatir tentang benang dan npm yang menghasilkan build yang berbeda. Berdasarkan entri blog ini , ini adalah perubahan yang tidak semestinya kami harapkan segera (entri blog juga menjelaskan perbedaan antara yarn.lockdan package-lock.json.

crimbo
sumber
11

Saya sedang memikirkan pertanyaan yang sama. Ini pemikiran saya, semoga membantu:

The dokumentasi NPM paket-lock.json mengatakan berikut:

package-lock.json secara otomatis dibuat untuk setiap operasi di mana npm mengubah pohon node_modules, atau package.json. Ini menjelaskan pohon persis yang dibuat, sehingga penginstalan selanjutnya dapat menghasilkan pohon yang identik, terlepas dari pembaruan dependensi menengah.

Ini bagus karena mencegah efek "bekerja pada mesin saya".

Tanpa file ini, jika Anda npm install --save A, NPM akan menambah "A": "^1.2.3"ke Anda package.json. Ketika orang lain berjalan npm installpada proyek Anda, adalah mungkin bahwa versi 1.2.4dari Atelah dirilis. Karena ini adalah versi terbaru yang tersedia yang memenuhi kisaran semver yang ditentukan di Anda package.json, versi ini akan diinstal. Tetapi bagaimana jika ada bug baru yang diperkenalkan pada versi ini? Orang ini akan mengalami masalah yang tidak dapat Anda tiru karena Anda memiliki versi sebelumnya, tanpa bug.

Dengan memperbaiki status node_modulesdirektori Anda , package-lock.jsonfile mencegah masalah ini karena setiap orang akan memiliki versi yang sama dari setiap paket.

Tetapi, bagaimana jika Anda menulis dan menerbitkan modul npm? Dokumentasinya mengatakan sebagai berikut:

Satu detail penting tentang package-lock.json adalah bahwa ia tidak dapat dipublikasikan, dan akan diabaikan jika ditemukan di tempat lain selain paket tingkat atas.

Jadi, meskipun Anda mengkomitnya, saat pengguna menginstal modul Anda, dia tidak akan mendapatkan package-lock.jsonfile, tetapi hanya package.jsonfile. Jadi npm akan menginstal versi terbaru yang memenuhi rentang semver dari semua dependensi Anda. Ini berarti bahwa Anda selalu ingin menguji modul Anda dengan versi-versi ini dari dependensi Anda, dan bukan yang Anda instal ketika Anda mulai menulis modul Anda. Jadi, dalam hal itu, package-lock.jsonjelas tidak berguna. Terlebih lagi, itu bisa mengganggu.

Cyrille
sumber
7

Inilah aturan praktis saya: jika Anda mengerjakan sebuah aplikasi, lakukan file kunci. Jika Anda mengelola pustaka, tambahkan ke daftar yang diabaikan. Apa pun itu, Anda harus menggunakan rentang semver yang akurat dalam package.json. Yehuda Katz ( cache ) menulis penjelasan yang bagus tentang kapan harus berkomitmen Gemfile.lock(file kunci Ruby) dan kapan harus tidak. Setidaknya baca bagian tl; dr.

ravinggenius
sumber
Tautannya rusak.
Juha Syrjälä
Terima kasih @ JuhaSyrjälä. Saya menambahkan tautan kedua ke artikel.
ravinggenius
Di mana daftar abaikan untuk npm atau benang?
neves
"daftar abaikan" akan spesifik untuk repositori sumber proyek Anda (git, mercurial, Subversion). Dalam kasus git, file tersebut dipanggil .gitignore, dan biasanya berada di root proyek.
ravinggenius
4

Kamu benar! Mengizinkan keduanya npmdan yarndigunakan akan menyebabkan masalah. Simak artikel ini .

Saat ini, kami berencana menambahkan beberapa peringatan kepada pengguna yang menggunakan keduanya yarn dan npmdi repositori yang sama untuk menginstal paket.

Kami sangat menyarankan Anda untuk menghapus package-lock.jsonfile jika Anda memutuskan untuk menggunakan benang untuk menghindari kebingungan di masa depan dan kemungkinan masalah konsistensi.

Anda mungkin tidak menginginkan keduanya npmdan yarnsebagai manajer paket Anda.

BinaryJoe01
sumber
2

File-file ini dikelola oleh perkakas Anda, jadi – dengan asumsi penggunaan benang akan secara efektif memperbarui package-lock.json–Saya kira melakukan kedua file akan bekerja dengan baik.

Saya pikir yang paling penting bagi pengguna Anda package-lock.json(I, misalnya, tidak menggunakan benang) sehingga satu ini memiliki harus dilakukan.

Untuk yarn.lockitu, tergantung apakah Anda bekerja sendiri atau dalam tim. Jika solo, maka saya kira tidak perlu melakukan itu. Jika Anda (berencana untuk) bekerja dalam sebuah tim, maka Anda mungkin harus melakukannya, setidaknya sampai benang mendukungnya 🙂

Saya kira tim benang pada akhirnya akan berhenti menggunakan yarn.lockdan menggunakan package-json.locksebagai gantinya, saat ini akan menjadi lebih sederhana 😛

dohzya
sumber
1
Itu tidak berhenti menggunakan yarn.lock.
jayarjo
0

Tidak, menggunakan kedua file kunci secara bersamaan akan paling sering menyebabkan ketidakkonsistenan dalam pohon ketergantungan Anda, terutama saat berkolaborasi dalam sebuah tim. Mengabaikan satu kunci atau lainnya adalah solusi sederhana. Pastikan tim Anda mengerti dan setuju dengan perubahan ini.

AndrewSteinheiser
sumber