Yarn.lock dosyasını yapmalıyım ve bunun için ne yapmalıyım?


305

Bir işlemi yarn.lockgerçekleştirdikten sonra iplik bir dosya oluşturur yarn install.

Bu depoya bağlanmalı mı yoksa yoksayılmalı mı? Bu ne için?


3
IMHO, bu soru (ve aşağıdaki cevapların çoğu), "yarn.lock dosyasını nasıl ve ne zaman yeniden oluşturmalıyız?"
MarkHu

1
Şimdi nasıl ve ne zaman olduğunu biliyor musun?
jayarjo

@MarkHu burada buldu: yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarn Yani temelde: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

Yanıtlar:


271

Evet, check-in yapmalısınız, bkz : npm'den taşıma

İplik, paketinizin kök dizininde bir yarn.lock dosyası oluşturur. Bu dosyayı okumanız veya anlamanız gerekmez - sadece kaynak kontrolüne bakın.


33
Güzel bulmak. Ben "ne bunun için?" Yanıtlarını dokümanlar aşağıdaki buldum : "npm istemci bağımlılık node_modules dizinine deterministically yükler.Bu sipariş bağımlılıkları yüklü, bir node_modules yapısı anlamına gelir dizini bir kişiden diğerine farklı olabilir. Bu farklılıklar avlanması uzun süren "makinemde çalışır" hatalarına neden olabilir.
rlay3

13
Devam ediyor: "İplik, kilit dosyalarını ve belirleyici ve güvenilir bir yükleme algoritmasını kullanarak sürüm oluşturma ve determinizm dışındaki bu sorunları çözer. Bu kilit dosyaları, yüklenen bağımlılıkları belirli bir sürüme kilitler ve her yüklemenin aynı dosya yapısıyla sonuçlanmasını sağlar. tüm makinelerde node_modules. "
rlay3

"Kilit dosyası bulunamadı" demek yerine. Sadece "yarn.lock dosyası oluşturuluyor" yazmalıdır. Duh :) Bu bir hata değil, ama bir hata gibi geliyor. Ve ikincisi, ters senaryoda herkes için yeterince endişe verici olacak (bir yarn.lock dosyasına sahip olmayı bekledikleri, ancak görünüşe göre yok).
Alexander Mills

7
İplik.lock'u projemizin belirli paket sürümlerine kilitlediğini takdir ediyorum, ancak "kilit" kelimesinin kullanımının talihsiz olduğunu hissediyorum. Genellikle kilit dosyaları ( .ldb gibi ), birbirine bağlı güncellemelerin neden olabileceği bozulmayı önlemek için bir kaynağı bir seferde bir işlemle sınırlamanın bir yoludur. Bu tür kilit dosyaları kesinlikle, muhtemelen yarn.lock ile ilgili karışıklığın çoğunun kaynaklandığı sürüm kontrolüne bağlı olmamalıdır.
Antony

2
"Bu dosyayı okumanız veya anlamanız gerekmez" ifadesini gerçekten sevmiyorum. Bu, projenizi korumak için önemli bir dosyadır.
Nathan Goings

83

Projenizin ne olduğuna bağlı:

  1. Projeniz bir uygulama mı? Sonra: Evet
  2. Projeniz bir kütüphane mi? Öyleyse: Hayır

Bunun daha ayrıntılı bir açıklaması Yarn'ın yaratıcılarından biri olan bu GitHub sayısında bulunabilir . diyor:

Package.json, orijinal yazar tarafından istenen sürümleri açıklarken, yarn.lock, belirli bir uygulama için bilinen en son iyi yapılandırmayı açıklar.

Yalnızca yarn.locküst düzey projenin-dosyası kullanılacaktır. Bu yüzden, projeler bağımsız olarak kullanılmayacak ve başka bir projeye yüklenmeyecekse, herhangi bir yarn.lock-dosyasını taahhüt etmenin bir faydası yoktur - bunun yerine package.json, projenin beklediği bağımlılık sürümlerini iletmek her zaman -dosyasına kadar olacaktır .


7
Öte yandan, kütüphane projelerinde kilit dosyasının bulunmaması, ilgili testlerinin tekrarlanabilirliğini etkiler mi?
E_net4 yakın seçmen

1
Açıklamanızı doğru okuduysam, "Projeniz bir kütüphane mi?" "İsterseniz" ile cevap olabilir. Dezavantajları yok gibi görünüyor, ancak karmaşık devDependencies varsa ve lib'nizin her geliştiricisinin aynı derleme ve test komut dosyalarına sahip olmasını istiyorsanız yararlı olabilir. Sağ?
Pipo

4
Kilit dosyası kitaplığınızın herhangi bir kullanıcısı için saygı görmeyeceğinden, kitaplığı geliştirirken buna güvenmek yanlış bir güvenlik hissi verebilir
VoxPelli

1
Dart, pubspec.yaml ve pubspec.lock ile aynı sisteme sahiptir ve yanıttaki ile aynı tavsiyede bulunmaktadır. Bkz bu soruyu ve bu belgeler girişi.
Jonas Kello

16
Lütfen bu
yazının Yarn'ın

66

Bunların birinde iki ayrı soru olduğunu görüyorum. Her ikisine de cevap vereyim.

Dosyayı repo haline getirmeli misiniz?

Evet. Ckuijjer'in cevabında belirtildiği gibi, Göç Kılavuzu'nda bu dosyayı repoya dahil etmeniz önerilir . Neden yapmanız gerektiğini anlamak için okumaya devam edin.

Nedir yarn.lock?

Projeniz için tam bağımlılık sürümlerini ve her paket için sağlama toplamlarını depolayan bir dosyadır. Bu, ipliğin bağımlılıklarınız için tutarlılık sağlamanın yoludur.

Bu dosyanın neden gerekli olduğunu anlamak için önce orijinal NPM'lerin arkasındaki sorunun ne olduğunu anlamanız gerekir package.json. Paketi yüklediğinizde NPM, belirli bir düzeltme (semver) yerine bağımlılığın izin verilen düzeltme aralığını depolar. NPM, belirtilen aralıktaki bağımlılığın en son bağımlılık sürümünü güncellemeye çalışacaktır (örn. Kırılmayan yama güncellemeleri). Bu yaklaşımla ilgili iki sorun vardır.

  1. Bağımlılık yazarları yama sürüm güncellemelerini yayınlarken, aslında projenizi etkileyecek bir değişiklik getirebilir.

  2. npm installFarklı zamanlarda çalışan iki geliştirici farklı bağımlılıklar kümesine sahip olabilir. Bu, bir hatanın tam olarak aynı iki ortamda yeniden üretilememesine neden olabilir. Bu, örneğin CI sunucuları için derleme kararlılığı sorunlarına neden olabilir.

İplik ise maksimum öngörülebilirlik yolunu takip ediyor. Tam bağımlılık sürümlerini yarn.lockkaydetmek için dosya oluşturur . Bu dosyanın yerinde ipliğe sahip olması, sürümleri çözümlemek yerine depolanmış sürümleri kullanır . Bu strateji, yukarıda açıklanan sorunların hiçbirinin gerçekleşmeyeceğini garanti eder.yarn.lockpackage.json

yarn.lockkomutu npm-shrinkwrap.jsonile oluşturulabilene benzer npm shrinkwrap. Bu iki dosya arasındaki farkları açıklayan bu cevabı kontrol edin .


1
Ama yarn.lockşimdi güncellendiğini görüyorum , neden ve ne zaman olduğunu biliyor musunuz yarn?
jayarjo

1
# 4379 ve # 4147 iplik sorunları , package.json'da değişiklik yapılmadan çalıştırma da dahil olmak üzere birçok durumda yarngüncelleme yarn.lockyapılmasını önermektedir yarn install. Kullanılması yarn install --frozen-lockfileönerildiği üzere Why pencerelerde ipliği hareket etmez yarn.lock değiştiren (veya üzeri yapılandırmaya .yarnrc) en iyi bahis gibi görünüyor.
Lauri Harpf

npm günümüzde bir package-lock.jsonve a npm ci. Bu iş akışı benzer iplik yarn.lockve yarn install --frozen-lockfile.
k0pernikus


8

Malısın:

  1. depoya ekleyin ve taahhüt edin
  2. yarn install --frozen-lockfileve yarn installyerel olarak ve CI derleme sunucularında varsayılan olarak DEĞİL kullanın .

(Dondurulmuş lockfile varsayılan davranışı yapmak için bir dava açmak üzere iplik sorunu izleyicisine bir bilet açtım, bkz. # 4147 ).


Dosyadaki frozen-lockfilebayrağı .yarnrc, package.json ve yarn.lock dosyasını senkronize etmenizi engelleyecek şekilde ayarlamamaya dikkat edin . Github'da ilgili iplik konusuna bakın


yarn installbeklenmedik bir şekilde kilitlenebilir , tekrarlanabilir yapıların iplik iddialarını geçersiz kılar. Sadece yarn installbir iplik kilidini başlatmak ve güncellemek için kullanmalısınız.

Ayrıca, esp. daha büyük ekiplerde, iplik geliştiricisinin yerel bir proje kurması nedeniyle iplik kilidindeki değişiklikler konusunda çok fazla gürültü olabilir.

Daha fazla bilgi için, burada da geçerli olan npm'nin package-lock.json hakkındaki cevabımı okuyun .


Bu, son zamanlarda iplik takma belgelerinde de açıkça belirtildi :

yarn install

Package.json içinde listelenen tüm bağımlılıkları yerel node_modules klasörüne yükleyin.

yarn.lockAşağıdaki gibi dosya kullanılır:

  • İplik.lock mevcutsa ve package.json içinde listelenen tüm bağımlılıkları karşılamak için yeterliyse, yarn.lock'ta kaydedilen tam sürümler kurulur ve yarn.lock değişmez. İplik daha yeni sürümleri kontrol etmeyecektir.
  • Yarn.lock yoksa veya package.json'da listelenen tüm bağımlılıkları karşılamak için yeterli değilse (örneğin, package.json'a elle bağımlılık eklerseniz), İplik paketteki kısıtlamaları karşılayan en yeni sürümleri arar. .json. Sonuçlar yarn.lock dizinine yazılır.

İplik.lock'un güncellenmediğinden emin olmak için, --frozen-lockfile.


Doğru olsa da , kullanmanız gerektiğini düşünebileceğim tek zaman --frozen-lockfile, birisi daha sonra güncellemeleri çalıştırmadan yarn installve teslim etmeden package.json'u manuel olarak güncellediyse. Dolayısıyla bir CI bu bayrağı kullanmak isteyebilir, ancak geliştiriciler sorunları gizlediği için yapmamalıdır.
jkrehm

@jkrehm Sorunları gizleyerek ne demek istediğinize bağlıdır. Çekme isteklerini şişirerek veya gereksiz birleştirme çakışmalarına neden olarak veya bir kitaplığı çekerek yarn.locktanıtılan beklenmedik şekilde değiştirilmiş dosyalarla daha fazla sorun yaşadım yarn install. (Sadece bir kütüphane semvar kullandığından, bir yama / küçük güncellemenin uygulamanızı bozmayacağı anlamına gelmez - orada bulundum). Güncellemenin yarn.locksadece manuel bir adım olması gerektiğini düşünüyorum , bu yüzden güvenilir ve deterministik olduğu için geliştirici makineme bile güveniyorum yarn install --frozen-lockfile(ve npm cinpm projelerine).
k0pernikus

1
Hiç yarn.lockbeklenmedik bir şekilde güncellenmesi ile ilgili bir sorun yaşamadım (çıktığında Ekim 2016'dan beri kullanıyorum). Her zaman manuel olarak bir şey yapan veya yükleme sonrası berbat bir komut dosyası kullanan bir kullanıcı olmuştur. NPM yerine İpliği tercih etmemin nedeni budur (NPM istediği her şeyi günceller). Sanırım bu sorunları yaşamadığım için kendimi şanslı göreceğim.
jkrehm

5

Deneyimlerimden, evet diyebilirim ki yarn.lockdosya yapmamız gerekir . Diğer insanlar projenizi kullandığında, projenizden beklenen bağımlılıkları edinmelerini sağlayacaktır.

Dokümandan

İplik veya iplik eklentisini çalıştırdığınızda, İplik paketinizin kök dizininde bir yarn.lock dosyası oluşturur. Bu dosyayı okumanız veya anlamanız gerekmez - sadece kaynak kontrolüne bakın. Diğer insanlar npm yerine İplik kullanmaya başladığında, yarn.lock dosyası tam olarak aynı bağımlılıklara sahip olmalarını sağlar.

Bir biz değiştirerek bunu başarabilir ki olabilir iddia ^ile --. Evet yapabiliriz, ancak genel olarak, npmpaketlerin çoğunun ^gösterim ile geldiğini gördük ve statik bağımlılık sürümünü sağlamak için gösterimi manuel olarak değiştirmeliyiz.Ama kullanırsanız yarn.lockprogramlı olarak doğru sürümünüzü sağlayacaktır.

Ayrıca Eric Elliott söylediği gibi burada

Gitgi iplik daha fazla. “Makinemde çalışıyor” hatalarından kaçınmak için deterministik bağımlılık çözünürlüğü sağlamak için var.


3

Evet, taahhüt etmelisin. Yarn.lock dosyası hakkında daha fazla bilgi için resmi belgeler bakın burada


3

Evet! yarn.lockBağımlılıkları yükleyen geliştiricilerin tam olarak aynı çıktıyı alması için kontrol edilmesi gerekir! Örneğin, npm [Ekim 2016'da kullanıma sunuldu] ile , patchyerel olarak bir sürüm (diyelim 1.2.0) yüklenebilirken, yeni bir sürüm çalıştıran yeni bir geliştirici installfarklı bir sürüm alabilir (1.2.1).


1
Bahsettiğiniz npm davranışı bağımlılıklarınızı nasıl kaydettiğinize bağlıdır. --save-exactNpm kullanırken tasarruf ederseniz, aynı davranışı elde edebilirsiniz.
AlicanC

4
@AlicanC Bunun bu kadar basit olduğunu düşünmüyorum. İpliğin (kararlı bir kilit dosyası aracılığıyla) aynı paket sürümünü ve tüm bağımlılıklarını da garanti edeceğine inanıyorum . Bu, NPM'nin her zaman bir sorunu olduğu için bir şeydir, çünkü bağımlılığın bağımlılığı belirli bir sürüme sabitlenmeyebilir, bu nedenle yeni bir yükleme farklı alt düzey bağımlılıkları çekebilir. NPM shrinkwrap'ın bu sorunu bir dereceye kadar çözmesi gerekiyordu, ancak her zaman zor oldu ve çoğu zaman düzgün çalışmıyor.
nextgentech

@nextgentech Bu durumda, bağımlılığın bağımlılığının düzgün bir şekilde güncellendiğinden nasıl emin olabilirim? Bazı (say 3) bağımlı paketleri olan bir ana paket varsa varsayalım. Ana paketimdeki değişiklikleri izleyeceğim ve package.json'da güncelleyeceğim. Ama 3 alt paketten herhangi biri tarafından güncellenirse, değişiklikleri nasıl alacağım? Kilit dosyası nedeniyle bu bağımlılıklar güncellenmeyecek değil mi?
Pragatheeswaran

Henüz onunla pek uğraşmadım, ama yarn upgradekomutun devreye girdiği yer olduğuna inanıyorum . Bu komut tüm paketleri yükseltir ve kilit dosyasını yeniden oluşturur. Bu nedenle, örneğin, bir uygulamayı üretime dağıtıyorsanız ve bağımlılıkları yüklemeniz gerekiyorsa, depodan çıkarılan kilit dosyasına göre bunu yapmanız gerekir. yarn upgradeAçık bir şekilde bağımlılık bilgilerini değiştirmek istemediğiniz sürece (ve böylece yeni bir kilit dosyası taahhüt ettiğiniz sürece) asla çalıştırmamalısınız .
nextgentech

yarn installaynı sürümleri sağlamaz. Sadece yarn install --frozen-lockfileöyle.
k0pernikus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.