web-dev-qa-db-ja.com

yarn.lockとnpmのシュリンクラップの違いは何ですか?

最近、YarnでNodeパッケージをインストールしようとしました。それはうまく機能し、NPMよりもはるかに高速です。Yarnはyarn.lock。 NPMシュリンクラップ(npm-shrinkwrap.json)。

それらの間に違いはありますか? yarn.lockはnpm-shrinkwrap.jsonよりも有利ですか?

53
Fizer Khan

yarn.lockファイルは、他のパッケージマネージャーのロックファイル、特にCargo.lockを持つRustのCargoパッケージマネージャーと非常に似ています。これらのロックファイルの考え方は、常に機能するはずのパッケージの一貫したセットを表すことです。

npmは依存関係の範囲をpackage.jsonファイルに保存します。つまり、誰かがあなたのパッケージをインストールすると、古いパッケージを実行している可能性があるため、異なる依存関係のセットを取得する可能性があります指定した依存関係の範囲)。たとえば、依存関係"foo": "^1.0.0"を指定した人を考えてみましょう。彼らは実際にfoo v1.0.1をインストールした可能性があります。これは、npm installを実行したときに最新だったからです。これは予期せず何かを壊す可能性があり、一貫したパッケージ解像度を保証するyarn.lockファイルがある場合は回避できます

npm shrinkwrapとの比較に関しては、 ドキュメント で非常に明確に説明されています。

Npmのnpm-shrinkwrap.jsonに似ていますが、損失はなく、再現可能な結果を​​作成します。

また、ドキュメントでは、yarn.lockをリポジトリにコミットすることをお勧めします(まだ行っていない場合)。一貫性のある再現可能なパッケージ解決の利点を享受できます。 この質問 では、これを行う理由についても説明しています。

npm shrinkwrapの損失のある動作は、npm自体が使用する非決定的なアルゴリズムによるものです。別の回答のコメントで述べられているように、npm shrinkwrap> npm install> npm shrinkwrapは、1回のシュリンクラッピングと同じ出力を生成することは保証されませんが、Yarnは "an install確定的で信頼できるアルゴリズム」

50
Aurora0001

それらの間に違いはありますか

ヤーンは、npm shrinkwrapと比較して、より決定的なアルゴリズムに従います。糸を使用している場合、シュリンクラップを使用し続けると直観に反します

これは yarn.lockのドキュメント で見つけることができます:

Npmのnpm-shrinkwrap.jsonに似ていますが、損失がなく、再現可能な結果を​​作成します

しかし、糸が生産準備ができているかどうかという疑問はまだ残っています。 GitHubリポジトリには未解決のバグが多数残っているため、1か月ほど待ちます。

5
nikjohn