2016-10-15 14 views
45

最近、NodeパッケージをYarnでインストールしようとしました。それは素晴らしく、NPMよりもはるかに高速です。ヤーンは自動的にyarn.lockを生成します。我々はすでにNPMシュリンクラップ(npm-shrinkwrap.json)を持っています。yarn.lockとnpmのシュリンクラップの違いは何ですか?

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

答えて

43

yarn.lockファイルは、他のパッケージマネージャーのロックファイル、特にRust's Cargoパッケージマネージャーによく似ています(Cargo.lock)。これらのロックファイルのアイデアは、常に動作するパッケージの一貫したセットを表すことです。

npmは、package.jsonファイルの依存関係の範囲を格納します。つまり、あなたが指定した依存関係の範囲を満たしていても、古いパッケージを実行している可能性があるため)。例えば、依存関係"foo": "^1.0.0"を指定した人をとります。彼らは実際にfoo v1.0.1をインストールしたかもしれません。なぜなら、それはnpm installを実行した最新のものですが、後で誰かがあなたのパッケージをインストールし、依存関係foo v1.1.0を取得します。これは予期しないことに壊れている可能性があります。これは、の一貫性のあるパッケージ解決を保証するyarn.lockファイルがある場合には避けることができます。

npm shrinkwrapとの比較については

the documentationは非常に明確にそれを説明する:

それはしかし、それは非可逆ではありません、NPMのNPM-shrinkwrap.jsonに似て、それは再現性のある結果を作成します。

あなたはすでにこれをやっていない場合のドキュメントにも、あなたのリポジトリへのyarn.lockをコミット助言、あなたが一貫して再現可能なパッケージ解像度の恩恵を享受することができます。 This questionも、なぜこれを行うべきかについてさらに説明しています。

npm shrinkwrapのロッシー動作は、npmによって使用される非決定論的アルゴリズムによるものです。別の答えのコメントに記載されているように、npm shrinkwrap>npm install>npm shrinkwrapは、一度シュリンクラッピングと同じ出力を生成する保証はありませんが、Yarnは明示的に"an install algorithm that is deterministic and reliable"を使用します。

+9

私は、npm-shrinkwrapの目的は依存関係をロックすることだと考えました。どうやってnpm-shrinkwrapが損失を起こすのか説明できますか? – styfle

+2

[shrinkwrap docs](https://docs.npmjs.com/cli/shrinkwrap)は、損失のないように発音します: "各依存関係の各バージョンを再帰的に指定して、後続のビルドとデプロイでは誤ってセーバーパターン " – styfle

+0

を満たす新しいバージョンの依存関係を取得しないでください。パッケージバージョンのセットをペグするためにロックボックスを追加するよりも簡単な機能を考えようとしていますが、何も思い付きませんでした。つまり、範囲の文字を取り除いて、バージョンを正確な数に固定するだけで、package.jsonをフィルタリングすることができます。私は彼を「もつれ」と呼ぶだろう。 cat package.json | tangle> package.pinned.json –

5

それらの間のいずれかの違いがあります npm shrinkwrapに比べて、より多くの決定論的なアルゴリズムに従います。あなたが糸を使用している場合は、シュリンクラップを使い続けることは

直感的だろうあなたはdocumentation for yarn.lockでこれを見つけることができます:

それはNPMのNPM-shrinkwrap.jsonに似て、しかしそれは非可逆ではありませんし、それ再現可能な結果を​​作成する

しかし、糸が生産準備が整っているかどうかは依然として疑問です。 GitHubリポジトリにはまだまだ沢山の目障りなバグが残っているので、1ヵ月ほど待つことにします。

+6

シュリ​​ンクラップがロッシーであることを意味していますか? –

+1

これは、 'npm shrinkwrap'>' npm install'> 'npm shrinkwrap'を実行すると、最初の時刻が – nikjohn

+4

のnpm-shrinkwrapファイルと異なることを意味します。 NPM shrinkwrap docs "npm installを引数なしで実行すると、単に既存のシュリンクラップが再現されます。" (ref:https://docs.npmjs.com/cli/shrinkwrap) –

関連する問題