Haruskah saya melakukan file yarn.lock dan untuk apa ini?

305

Benang membuat yarn.lockfile setelah Anda melakukan yarn install.

Haruskah ini dilakukan ke repositori atau diabaikan? Untuk apa ini?

rlay3
sumber
3
IMHO, pertanyaan ini (dan sebagian besar jawaban di bawah) tidak lengkap karena tidak ada pertanyaan, "Bagaimana dan kapan kita harus membuat ulang file yarn.lock?"
MarkHu
1
Apakah Anda tahu sekarang bagaimana dan kapan?
jayarjo
@MarkHu menemukannya di sini: yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarn Jadi pada dasarnya:Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
jayarjo

Jawaban:

271

Ya, Anda harus memeriksanya, lihat Migrasi dari npm

Yarn akan menghasilkan file yarn.lock dalam direktori root paket Anda. Anda tidak perlu membaca atau memahami file ini - cukup periksa di kontrol sumber.

ckuijjer
sumber
33
Temuan yang bagus. Saya telah menemukan yang berikut dari dokumen mereka yang menjawab "untuk apa?": "Klien npm menginstal dependensi ke direktori node_modules secara non-deterministik. Ini berarti bahwa berdasarkan urutan dependensi diinstal, struktur node_modules direktori bisa berbeda dari satu orang ke orang lain. Perbedaan ini dapat menyebabkan bug "berfungsi pada komputer saya" yang membutuhkan waktu lama untuk diburu. "
rlay3
13
Lanjutan: "Benang menyelesaikan masalah-masalah ini seputar versi dan non-determinisme dengan menggunakan file kunci dan algoritma pemasangan yang deterministik dan dapat diandalkan. File kunci ini mengunci dependensi yang diinstal ke versi tertentu, dan memastikan bahwa setiap pemasangan menghasilkan struktur file yang sama persis di node_modules di semua mesin. "
rlay3
Alih-alih mengatakan "tidak ada lockfile ditemukan". Seharusnya hanya mengatakan "Menghasilkan file yarn.lock". Duh :) Ini bukan kesalahan, tetapi yang pertama terdengar seperti kesalahan. Dan yang terakhir akan cukup mengkhawatirkan bagi siapa pun dalam skenario terbalik, (di mana mereka berharap memiliki file yarn.lock, tetapi tampaknya tidak).
Alexander Mills
7
Saya menghargai yarn.lock mengunci proyek kami ke versi paket tertentu, tetapi saya merasa penggunaan kata "kunci" sangat disayangkan. Biasanya file kunci (seperti .ldb ) adalah cara membatasi sumber daya untuk satu proses pada satu waktu untuk mencegah korupsi yang disebabkan oleh pembaruan. File kunci seperti itu pastinya tidak boleh dikomit ke kontrol versi, yang mungkin merupakan tempat sebagian besar kebingungan tentang yarn.lock berasal.
Antony
2
Saya benar-benar tidak suka frasa "Anda tidak perlu membaca atau memahami file ini". Ini adalah file penting untuk memelihara proyek Anda.
Nathan Goings
83

Tergantung pada apa proyek Anda:

  1. Apakah proyek Anda aplikasi? Lalu: Ya
  2. Apakah proyek Anda perpustakaan? Jika demikian: Tidak

Deskripsi yang lebih terperinci tentang hal ini dapat ditemukan dalam masalah GitHub ini di mana salah satu pembuat Benang mis. mengatakan:

Package.json menjelaskan versi yang diinginkan yang diinginkan oleh penulis asli, sementara yarn.lock menjelaskan konfigurasi terakhir yang diketahui baik untuk aplikasi yang diberikan.

Hanya yarn.lock-file dari proyek tingkat atas yang akan digunakan. Jadi, kecuali jika proyek yang akan digunakan mandiri dan tidak dipasang ke proyek lain, maka tidak ada gunanya melakukan yarn.lock-file - sebagai gantinya akan selalu sampai ke package.json-file untuk menyampaikan versi dependensi apa yang diharapkan oleh proyek itu.

VoxPelli
sumber
7
Di sisi lain, tidak akankah file kunci dalam proyek perpustakaan mempengaruhi reproduktifitas tes masing-masing?
E_net4 suka downvotes
1
Jika saya membaca deskripsi Anda dengan benar, daripada "Apakah proyek Anda perpustakaan?" dapat dijawab dengan "Jika Anda mau". Tampaknya tidak memiliki kelemahan, tetapi bisa berguna, jika Anda memiliki dependensi dev yang kompleks dan Anda ingin setiap pengembang lib Anda memiliki skrip build dan test yang sama. Baik?
Pipo
4
Karena file kunci tidak akan dihormati untuk pengguna perpustakaan Anda, maka mengandalkannya ketika mengembangkan perpustakaan dapat memberikan rasa aman yang salah
VoxPelli
1
Dart memiliki sistem yang sama dengan pubspec.yaml dan pubspec.lock dan merekomendasikan hal yang sama seperti pada jawabannya. Lihat pertanyaan ini dan entri dokumentasi ini .
Jonas Kello
16
Silakan lihat entri ini di blog resmi Yarn: File kunci harus dilakukan pada semua proyek
E_net4 suka downvotes
66

Saya melihat ini adalah dua pertanyaan terpisah dalam satu. Biarkan saya jawab keduanya.

Haruskah Anda mengkomit file ke dalam repo?

Iya. Seperti disebutkan dalam jawaban ckuijjer, disarankan dalam Panduan Migrasi untuk memasukkan file ini ke dalam repo. Baca terus untuk memahami mengapa Anda perlu melakukannya.

Apa yarn.lock?

Ini adalah file yang menyimpan versi ketergantungan yang tepat untuk proyek Anda bersama dengan checksum untuk setiap paket. Ini adalah cara benang untuk memberikan konsistensi bagi dependensi Anda.

Untuk memahami mengapa file ini diperlukan, Anda harus terlebih dahulu memahami apa masalah di balik NPM asli package.json. Saat Anda menginstal paket, NPM akan menyimpan berbagai revisi dari dependensi alih-alih revisi tertentu (semver). NPM akan mencoba mengambil pembaruan dependensi versi terbaru dari dependensi dalam rentang yang ditentukan (yaitu pembaruan patch yang tidak putus). Ada dua masalah dengan pendekatan ini.

  1. Penulis ketergantungan mungkin merilis pembaruan versi tambalan sementara pada kenyataannya memperkenalkan perubahan besar yang akan memengaruhi proyek Anda.

  2. Dua pengembang berjalan npm installpada waktu yang berbeda dapat memperoleh rangkaian dependensi yang berbeda. Yang dapat menyebabkan bug tidak dapat direproduksi pada dua lingkungan yang persis sama. Ini akan menyebabkan masalah stabilitas bangunan untuk server CI misalnya.

Benang di sisi lain mengambil rute prediktabilitas maksimum. Itu menciptakan yarn.lockfile untuk menyimpan versi ketergantungan yang tepat . Setelah file itu di tempat, benang akan menggunakan versi yang disimpan yarn.lockalih-alih menyelesaikan versi dari package.json. Strategi ini menjamin bahwa tidak ada masalah yang dijelaskan di atas terjadi.

yarn.lockmirip dengan npm-shrinkwrap.jsonyang bisa dibuat dengan npm shrinkwrapperintah. Periksa jawaban ini menjelaskan perbedaan antara dua file ini.

Juriy
sumber
1
Tapi saya melihat yarn.locksedang diperbarui sekarang dan kemudian, apakah Anda tahu mengapa dan kapan yarnmelakukan itu?
jayarjo
1
Masalah benang # 4379 dan # 4147 menyarankan yarnpembaruan yarn.lockdalam banyak kasus, termasuk berjalan yarn installtanpa perubahan pada package.json. Menggunakan yarn install --frozen-lockfileseperti yang disarankan dalam Mengapa menjalankan benang pada windows mengubah yarn.lock (atau mengonfigurasikannya melalui .yarnrc) sepertinya adalah taruhan terbaik.
Lauri Harpf
npm saat ini memiliki a package-lock.jsondan a npm ci. Alur kerja itu adalah benang analog yarn.lockdan yarn install --frozen-lockfile.
k0pernikus
10

Saya kira ya, karena versi Benang file yarn.lock sendiri: https://github.com/yarnpkg/yarn

Ini digunakan untuk resolusi dependensi paket deterministik.

jarekwg
sumber
8

Anda harus:

  1. tambahkan ke repositori dan komit
  2. gunakan yarn install --frozen-lockfiledan BUKAN yarn installsebagai default baik secara lokal maupun pada CI build server.

(Saya membuka tiket pada pelacak isu benang untuk membuat case untuk membuat perilaku default frozen-lockfile, lihat # 4147 ).


Berhati-hatilah untuk TIDAK mengatur frozen-lockfileflag pada .yarnrcfile karena itu akan mencegah Anda untuk dapat menyinkronkan file package.json dan yarn.lock. Lihat masalah benang terkait di github


yarn installdapat mengubah benang Anda. Buka secara tidak terduga , membuat klaim benang tentang bangunan berulang dapat dibatalkan dan dibatalkan. Anda hanya boleh menggunakan yarn installuntuk menginisialisasi sebuah thread.lock dan untuk memperbaruinya.

Juga, esp. di tim yang lebih besar, Anda mungkin memiliki banyak suara di sekitar perubahan kunci benang hanya karena pengembang sedang menyiapkan proyek lokal mereka.

Untuk informasi lebih lanjut, baca jawaban saya tentang paket-lock.json npm seperti yang berlaku di sini juga.


Ini juga baru-baru ini dibuat jelas dalam dokumen untuk pemasangan benang :

yarn install

Instal semua dependensi yang tercantum dalam package.json di folder node_modules lokal.

The yarn.lockfile digunakan sebagai berikut:

  • Jika yarn.lock hadir dan cukup untuk memenuhi semua dependensi yang tercantum dalam package.json, versi yang tepat dicatat di yarn.lock diinstal, dan yarn.lock tidak akan berubah. Benang tidak akan memeriksa versi yang lebih baru.
  • Jika yarn.lock tidak ada, atau tidak cukup untuk memenuhi semua dependensi yang tercantum dalam package.json (misalnya, jika Anda secara manual menambahkan dependensi ke package.json), Benang mencari versi terbaru yang tersedia yang memenuhi kendala dalam paket. .json. Hasilnya ditulis ke yarn.lock.

Jika Anda ingin memastikan yarn.lock tidak diperbarui, gunakan --frozen-lockfile.

k0pernikus
sumber
Meskipun benar, satu-satunya waktu saya dapat berpikir bahwa Anda harus menggunakan --frozen-lockfileadalah jika seseorang secara manual memperbarui package.json tanpa selanjutnya menjalankan yarn installdan melakukan pembaruan. Jadi CI mungkin ingin menggunakan bendera itu, tetapi pengembang tidak boleh karena menyembunyikan masalah.
jkrehm
@ jkrehm Tergantung pada apa yang Anda maksud dengan menyembunyikan masalah. Saya memiliki lebih banyak masalah dengan perubahan tak terduga yarn.lockfile yang diperkenalkan oleh yarn install, baik dengan membengkak permintaan tarik, atau dengan menyebabkan konflik gabungan yang tidak perlu, atau dengan menarik perpustakaan yang rusak. (Hanya karena perpustakaan menggunakan semvar, tidak berarti pembaruan patch / minor tidak akan merusak aplikasi Anda - Saya telah ada di sana). Saya menganggap memperbarui yarn.lockseharusnya hanya langkah manual, itulah sebabnya saya mengandalkan yarn install --frozen-lockfile(dan npm cipada proyek npm) bahkan pada mesin dev saya karena dapat diandalkan dan deterministik.
k0pernikus
1
Saya tidak pernah memiliki masalah dengan yarn.lockmendapatkan pembaruan yang tidak terduga (telah digunakan sejak Oktober 2016 ketika keluar). Itu selalu menjadi pengguna melakukan sesuatu secara manual atau script post-install yang buruk. Itu alasan saya lebih suka Benang daripada NPM (NPM memperbarui semuanya kapan saja dia mau). Saya kira saya akan menganggap diri saya beruntung tidak mengalami masalah tersebut.
jkrehm
5

Dari pengalaman saya, saya akan mengatakan ya kita harus melakukan yarn.lockfile. Ini akan memastikan bahwa, ketika orang lain menggunakan proyek Anda, mereka akan mendapatkan dependensi yang sama seperti yang diharapkan oleh proyek Anda.

Dari Doc

Saat Anda menjalankan benang atau penambahan benang, Benang akan menghasilkan file yarn.lock dalam direktori root paket Anda. Anda tidak perlu membaca atau memahami file ini - cukup periksa di kontrol sumber. Ketika orang lain mulai menggunakan Benang alih-alih npm, file yarn.lock akan memastikan bahwa mereka mendapatkan dependensi yang sama persis seperti yang Anda miliki.

Satu berpendapat bisa, bahwa kita dapat mencapainya dengan mengganti ^dengan --. Ya kami bisa, tetapi secara umum, kami telah melihat bahwa sebagian besar npmpaket disertai dengan ^notasi, dan kami harus mengubah notasi secara manual untuk memastikan yarn.lockversi dependensi statis. Tetapi jika Anda menggunakannya secara terprogram akan memastikan versi yang benar.

Juga seperti yang dikatakan Eric Elliott di sini

Jangan .gitignore yarn.lock. Itu ada untuk memastikan resolusi dependensi deterministik untuk menghindari bug "berfungsi pada mesin saya".

Anshul
sumber
3

Ya, Anda harus melakukannya. Untuk informasi lebih lanjut tentang file yarn.lock, lihat dokumen resmi di sini

Navin prasad
sumber
3

Iya! yarn.lockharus diperiksa agar setiap pengembang yang memasang dependensi mendapatkan hasil yang sama persis! Dengan npm [yang tersedia pada Oktober 2016] , misalnya, Anda dapat menginstal patchversi (katakanlah 1.2.0) secara lokal sementara pengembang baru yang menjalankan versi baru installmungkin mendapatkan versi yang berbeda (1.2.1).

enapupe
sumber
1
Perilaku npm yang Anda sebutkan tergantung pada bagaimana Anda menyimpan dependensi Anda. Jika Anda menyimpan dengan --save-exactsaat menggunakan npm, Anda dapat mencapai perilaku yang sama.
AlicanC
4
@AlicanC Saya tidak berpikir sesederhana itu. Saya percaya benang (melalui file kunci berkomitmen) akan menjamin versi paket yang sama dan semua dependensinya juga . Ini adalah sesuatu yang selalu bermasalah dengan NPM, karena dependensi dependensi mungkin tidak disematkan ke versi tertentu, sehingga instalasi baru mungkin menarik berbagai dependensi tingkat bawah yang berbeda. NPM shrinkwrap seharusnya menyelesaikan masalah ini sampai batas tertentu, tetapi selalu rumit dan sangat sering tidak berfungsi dengan benar.
nextgentech
@nextgentech Jika dalam kasus itu bagaimana saya memastikan bahwa ketergantungan dari ketergantungan diperbarui dengan benar. Misalkan jika saya memiliki paket utama yang memiliki beberapa (misalnya 3) paket dependen. Saya akan melihat perubahan dalam paket utama saya dan memperbaruinya di package.json. Tetapi jika salah satu dari 3 paket sub diperbarui oleh mereka bagaimana saya akan mendapatkan perubahan? Karena file kunci dependensi tersebut tidak akan diperbarui kan?
Pragatheeswaran
Saya belum banyak mengotak-atiknya, tapi saya percaya di situlah yarn upgradeperintah itu berperan. Perintah ini akan memutakhirkan semua paket dan membuat ulang file kunci. Jadi, misalnya, jika Anda menggunakan aplikasi untuk produksi dan perlu menginstal dependensi, itu akan dilakukan berdasarkan file kunci yang ditarik dari repositori. Anda seharusnya tidak pernah berjalan yarn upgradekecuali jika Anda secara eksplisit ingin mengubah informasi dependensi (dan karenanya melakukan file kunci baru).
nextgentech
yarn installtidak akan memastikan versi yang sama. Hanya yarn install --frozen-lockfileitu.
k0pernikus