ヤーンロックファイルをコミットする必要がありますか?それは何のためですか?


305

Yarnは、yarn.lockを実行した後にファイルを作成しますyarn install

これをリポジトリにコミットするか、無視する必要がありますか?それは何のため?


3
私見、この質問(および以下の回答のほとんど)は、「yarn.lockファイルをいつどのように再生成する必要があるのか​​」という質問が欠落しているために不完全です。
MarkHu

1
いつ、どのように、いつ知っていますか?
jayarjo 2018年

@MarkHuは、ここでそれを見つけた:yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarnだから、基本的には: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

回答:


271

はい、チェックインする必要があります。npmからの移行を参照してください。

Yarnは、パッケージのルートディレクトリ内にyarn.lockファイルを生成します。このファイルを読んだり理解したりする必要はありません。ソース管理にチェックインするだけです。


33
いい発見。私は彼らのドキュメントから「何のためですか?」と答える以下を見つけました:「npmクライアントは依存関係をnode_modulesディレクトリに非決定的にインストールします。これは依存関係がインストールされる順序に基づいて、node_modulesの構造がディレクトリは人によって異なる場合があります。これらの違いは、「私のマシンで動作する」バグを引き起こし、追跡に時間がかかる可能性があります。
rlay3

13
続き:「ヤーンは、ロックファイルと、確定的で信頼性の高いインストールアルゴリズムを使用して、バージョニングと非決定性に関するこれらの問題を解決します。これらのロックファイルは、インストールされた依存関係を特定のバージョンにロックし、すべてのインストールで同じファイル構造になるようにします。すべてのマシンにわたるnode_modules。」
rlay3

「ロックファイルが見つかりません」と言う代わりに。それは「Generating yarn.lock file」と言うだけです。Duh :)これはエラーではありませんが、前者はエラーのように聞こえます。そして、後者は逆のシナリオの誰にとっても十分に憂慮すべきものです(彼らは、yarn.lockファイルがあることを期待していますが、明らかにそうではありません)。
Alexander Mills

7
ヤーンロックがプロジェクトを特定のパッケージバージョンにロックしていることに感謝しますが、「ロック」という言葉の使用は残念です。通常、ロックファイル.ldbなど)は、更新が原因で発生する可能性のある破損を防ぐために、リソースを一度に1つのプロセスに制限する手段です。このようなロックファイルは、バージョン管理にコミットするべきではありません。バージョン管理には、yarn.lockに関する混乱のほとんどが原因である可能性があります。
アントニー2017年

2
「このファイルを読んだり理解したりする必要はありません」というフレーズは本当に嫌いです。これは、プロジェクトを維持するための重要なファイルです。
Nathan Goings

83

プロジェクトの内容によって異なります。

  1. あなたのプロジェクトはアプリケーションですか?その後:はい
  2. あなたのプロジェクトはライブラリですか?その場合:いいえ

これについてのより詳細な説明は、このGitHubの問題で見つけることができます。言う:

package.jsonは、元の作成者が希望する意図したバージョンを示し、yarn.lockは、特定のアプリケーションの最新の既知の適切な構成を示します。

yarn.lock最上位プロジェクトの-file のみが使用されます。したがって、1つのプロジェクトがスタンドアロンで使用され、別のプロジェクトにインストールされない限り、yarn.lock-file をコミットする意味はありません。代わりに、常にpackage.json、プロジェクトが予期する依存関係のバージョンを伝えるの -fileです。


7
一方、ライブラリプロジェクトにロックファイルがあると、それぞれのテストの再現性に影響しませんか?
E_net4は2016

1
説明を正しく読んだ場合、「プロジェクトはライブラリですか?」「あなたが望むなら」で答えることができます。これには欠点はないようですが、devDependenciesが複雑で、libのすべての開発者に同じビルドスクリプトとテストスクリプトを持たせたい場合に役立ちます。正しい?
Pipo 2016年

4
ロックファイルはライブラリのどのユーザーに対しても尊重されないため、ライブラリの開発時にロックファイルに依存すると、誤った安心感を与える可能性があります
VoxPelli

1
Dartはpubspec.yamlとpubspec.lockで同じシステムを使用しており、回答と同じものを推奨しています。この質問とこのドキュメントのエントリを参照してください。
Jonas Kello、

16
Yarnの公式ブログでこのエントリを参照してください:ロックファイルはすべてのプロジェクトでコミットする必要があります
E_net4は楽しい

66

私はこれらが1つの2つの別々の質問だと思います。両方にお答えしましょう。

ファイルをリポジトリにコミットする必要がありますか?

はい。ckuijjerの回答で述べたように、移行ガイドでこのファイルをリポジトリに含めることをお勧めします。理由を理解するために読んでくださいそれを行う必要がある。

なにyarn.lock

これは、プロジェクトの正確な依存関係のバージョンと各パッケージのチェックサムを格納するファイルです。これは、依存関係に一貫性を提供する糸の方法です。

このファイルが必要な理由を理解するには、最初に元のNPMの背後にある問題が何であったかを理解する必要がありますpackage.json。パッケージをインストールすると、NPMは特定のリビジョン(サーバー)ではなく、依存関係の許可されたリビジョンの範囲を保存します。NPMは、指定された範囲内の依存関係の最新バージョンの依存関係をフェッチしようとします(つまり、互換性のないパッチ更新)。このアプローチには2つの問題があります。

  1. 依存関係の作成者は、実際にプロジェクトに影響を与える重大な変更を導入しながら、パッチバージョンの更新をリリースする場合があります。

  2. npm install異なる時間に実行されている2人の開発者は、異なる依存関係のセットを取得する場合があります。これにより、まったく同じ2つの環境でバグを再現できなくなる可能性があります。これにより、たとえばCIサーバーのビルド安定性の問題が発生する可能性があります。

一方、糸は最大の予測可能性のルートをとります。依存関係yarn.lock正確なバージョンを保存するファイルを作成します。そのファイルを適所に配置するとyarn.lock、からのバージョンを解決する代わりに、に保存されているバージョンが使用されますpackage.json。この戦略により、上記の問題が発生しないことが保証されます。

yarn.lockコマンドnpm-shrinkwrap.jsonで作成できるものと似ていますnpm shrinkwrap。これらの2つのファイルの違いを説明するこの回答を確認してください。


1
しかし、私はyarn.lock時々更新されるのを見ますが、なぜ、いつそれが行われるのか知っyarnていますか?
jayarjo 2018年

1
糸の問題#4379#4147は、package.jsonを変更せずに実行することを含め、多くの場合yarn更新yarn.lock推奨していますyarn install。使い方yarn install --frozen-lockfileで提案されているようになぜすると、Windows上で糸を実行すると、yarn.lock変更しない(または経由でそれを設定し.yarnrc)最善の策のように思えます。
Lauri Harpf、

現在、npmにはa package-lock.jsonとaがありnpm ciます。そのワークフローは、類似の糸のですyarn.lockyarn install --frozen-lockfile
k0pernikus

10

Yarnは独自のyarn.lockファイルをバージョン管理しているので、私はそうだと思います:https : //github.com/yarnpkg/yarn

確定的なパッケージ依存関係の解決に使用されます。


8

あなたがすべき:

  1. リポジトリに追加してコミットする
  2. ローカルとCIビルドサーバーの両方で、デフォルトとして使用yarn install --frozen-lockfileyarn installます。

(yarnの課題トラッカーでチケットを開いて、frozen-lockfileをデフォルトの動作にするケースを作成しました。#4147を参照してください)。


ファイルにfrozen-lockfileフラグを設定しないように注意してください。フラグを設定する.yarnrcと、package.jsonファイルとyarn.lockファイルを同期できなくなります。githubで関連する糸の問題を参照してください


yarn install糸が予期せず変化し、糸が繰り返し可能なビルドを無効にしたり無効にしたりする可能性があります。を使用yarn installして、yarn.lockを初期化し、それを更新する必要があります。

また、特に 大規模なチームでは、開発者がローカルプロジェクトをセットアップしただけで、糸ロックの変更に関して多くのノイズが発生する可能性があります。

詳細については、npmのpackage-lock.jsonに関する私の回答を読んでください。ここでも同様です。


これは最近、yarn installのドキュメントでも明らかになりました:

yarn install

ローカルのnode_modulesフォルダーのpackage.jsonにリストされているすべての依存関係をインストールします。

yarn.lock以下のようにファイルが利用されています:

  • yarn.lockが存在し、package.jsonにリストされているすべての依存関係を満たすのに十分である場合、yarn.lockに記録されている正確なバージョンがインストールされ、yarn.lockは変更されません。糸は新しいバージョンをチェックしません。
  • yarn.lockがないか、package.jsonにリストされているすべての依存関係を満たすのに十分でない場合(たとえば、package.jsonに手動で依存関係を追加する場合)、Yarnはパッケージの制約を満たす最新の利用可能なバージョンを探します.json。結果は、yarn.lockに書き込まれます。

yarn.lockが更新されないようにしたい場合は、 --frozen-lockfile.


真の間、私はあなたが考えていることを考えることができる唯一の時間持って使用することには、--frozen-lockfile誰かが手動で実行せずに、その後package.jsonを更新した場合であるyarn installと更新をコミットします。したがって、CIはそのフラグを使用する必要があるかもしれませんが、問題を隠すため、開発者は使用しないでください。
jkrehm

@jkrehm問題を非表示にすることの意味によって異なります。プルリクエストの肥大化、不必要なマージの競合の発生、または壊れたライブラリのプルにより、によってyarn.lock導入された予期せず変更されたファイルでさらに問題が発生しましたyarn install。(ライブラリがsemvarを使用しているからといって、パッチ/マイナーアップデートによってアプリが壊れないという意味ではありません-私はそこにいます)。更新yarn.lockは手動でのみ行うべきだと考えています。これは、信頼性が高く確定的であるため、開発マシンでも信頼できるyarn install --frozen-lockfile(そしてnpm cinpmプロジェクトに依存する)理由です。
k0pernikus

1
yarn.lock予期せず更新されることに問題があったことはありません(2016年10月にリリースされてから使用されています)。これは常に、手動で何かをしたり、お粗末なインストール後スクリプトを実行したりするユーザーでした。それが私がNPMよりも糸を好む理由です(NPMは、必要に応じてすべての時間を更新します)。私はこれらの問題に遭遇しなかったことを幸運に思うと思います。
jkrehm

5

私の経験から、はい、私たちはyarn.lockファイルをコミットするべきだと言います。他の人があなたのプロジェクトを使うとき、彼らがあなたのプロジェクトが期待するのと同じ依存関係を確実に得るでしょう。

文書から

糸または糸追加のいずれかを実行すると、糸はパッケージのルートディレクトリ内に.lockファイルを生成します。このファイルを読んだり理解したりする必要はありません。ソース管理にチェックインするだけです。他の人がnpmの代わりにYarnを使い始めると、yarn.lockファイルは、彼らがあなたと正確に同じ依存関係を取得することを保証します。

一つは、私たちが交換することにより、それを達成できることを、可能性が主張^して--。はい、できますが、一般的に、npmパッケージの大部分には^表記が付いていることがわかりました。静的な依存関係のバージョンを確保するには、表記を手動で変更する必要があります。yarn.lockバージョンを確認するには、ます。

エリック・エリオットがここで言ったように

.gitignore yarn.lockを使わないでください。「私のマシンで動作する」バグを回避するために、確定的な依存関係の解決を確実にするためにあります。



3

はい!yarn.lock依存関係をインストールする開発者がまったく同じ出力を得るようにチェックインする必要があります! NPM [2016年10月に利用可能であった]、たとえば、あなたが持つことができpatch、新鮮なを実行している新しい開発者がローカルにインストールされている間(1.2.0を言う)、バージョンinstallの異なるバージョン(1.2.1)を得るかもしれないが。


1
言及したnpmの動作は、依存関係を保存する方法によって異なります。--save-exactnpmを使用するときに保存すると、同じ動作を実現できます。
AlicanC 2016年

4
@AlicanCそんなに簡単だとは思いません。私は(コミットされたロックファイルを介して)糸が同じバージョンのパッケージとそのすべての依存関係も保証することを信じています。これは、依存関係の依存関係が特定のバージョンに固定されていない可能性があるため、NPMには常に問題がありました。そのため、新しいインストールでは、より低いレベルの依存関係が取り込まれる可能性があります。NPMシュリンクラップはこの問題をある程度解決するはずでしたが、常にトリッキーであり、多くの場合正しく機能しません。
nextgentech 2016年

@nextgentechその場合、依存関係の依存関係が正しく更新されていることをどのように確認しますか?いくつかの(たとえば3つの)​​依存パッケージがあるメインパッケージがあるとします。メインパッケージの変更を監視し、package.jsonで更新します。しかし、3つのサブパッケージのいずれかがそれらによって更新された場合、どのようにして変更を取得できますか?ロックファイルのために、これらの依存関係は正しく更新されませんか?
Pragatheeswaran

私はまだそれをいじくり回していませんが、それがyarn upgradeコマンドの出番だと思います。このコマンドは、すべてのパッケージをアップグレードし、ロックファイルを再作成します。したがって、たとえば、アプリを本番環境にデプロイしていて、依存関係をインストールする必要がある場合は、リポジトリからプルダウンされたロックファイルに基づいて依存関係をインストールします。yarn upgrade依存関係情報を明示的に変更したい(したがって、新しいロックファイルをコミットしたい)場合を除き、実行しないでください。
nextgentech 2016年

yarn install同じバージョンを保証しません。ありませyarn install --frozen-lockfileん。
k0pernikus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.