96

私のパッケージにこれらの依存関係がある場合

{ "name": "my-package",
  "dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }

そして、foobarパッケージにはこれらの依存関係があります

{ "name": "foobar",
  "dependencies": { "baz":"^2.0.0" }

の最新リリース バージョンはbaz2.1.0、 の最初の実行はyarnにインストールbaz@2.1.0されfoobar/node_modulesます。

baz@2.0.9ヤーンにパッケージを強制的に使用させるにはどうすればよいfoobarですか?

npm shrinkwrap私の理解では、これは(a la this question )を使用して可能になるということです。


私の質問の要約はおそらく次のとおりです。Yarn は反復可能で決定論的なインストールを作成しますが、そのインストールをどのようにカスタマイズしますか?

4

3 に答える 3

134

実際に、受け入れられるバージョンが過度に制限されているサブ依存関係がある場合は、yarn を使用してそれらをオーバーライドできます。

更新された編集: Yarn は現在、1.0 の時点で、「解像度」ブロックを正式にサポートしています。したがって、解像度をオーバーライドする方法は、次のようなブロックを に追加するだけですpackage.json:

"resolutions": {
      "package-a": "2.0.0",
      "package-b": "5.0.0",
      "package-c": "1.5.2"
}

「互換性のない」バージョンの警告が表示されることがありますが、一部のパッケージ (socket.io など) は受け入れるバージョンが過度に制限されていることがわかりました。したがって、実際に壊れていない場合は喜んで最新バージョンを選択します。もの。

以下のオリジナルだが時代遅れの回答。

元の質問は正確には正しくないように思えますが、実際には元の質問私が答えたかったものであり、答えを見つけたので、ここに後世のためのものがあります:

私は socket.io ライブラリを使用していますcomponent-emitterが、依存関係があります。ただし、必要なバージョンのペアがあります。これは、何かを変更する前の yarn.lock ファイルの外観です。

component-emitter@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

component-emitter@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"

そのため、クライアント コードにコンポーネント エミッターの 2 つのコピーが含まれていました。私が調べたところ、1.1.2 と 1.2.0 (または最新の 1.2.1) の間に重大な変更はないようでした。最初に yarn.lock ファイルを変更してみました:

component-emitter@1.2.1, component-emitter@^1.2.1, component-emitter@1.1.2:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"

これは機能しましたが、ファイルには自動生成に関する警告があり、追加するすべての更新または新しいパッケージがこの変更を踏みにじることを意味します。少し検索yarn --flatすると、yarn がプロジェクト全体で各パッケージを 1 つしか選択しないようにするオプションが見つかりました。古いパッケージと新しいパッケージの間に互換性がないという実際のケースがあると確信しているので、それはやり過ぎのように思えます。ダウンロードを小さくするために、クライアント コードから冗長なパッケージを削除したかっただけです。私はまだ開発パッケージがすべて正しく動作することを望んでいます。

しかし、yarn --flatのドキュメントで、package.json に入れることができる「解像度」ブロックへの参照を見つけました。

"resolutions": {
  "package-a": "2.0.0",
  "package-b": "5.0.0",
  "package-c": "1.5.2"
}

そこで"component-emitter" : "1.2.1"、package.json に新しい「解像度」ブロックを入れてみました。実際、必要なすべての場所で component-emitter が 1.2.1 にフラット化され、クライアント コードに 1 つのコピーしかありません。

(そして、resolutionsブロックは で完全にサポートされるyarnようになったため、 を使用する必要さえありません--flat。)

于 2016-12-11T03:43:02.343 に答える
1

編集:これは非推奨になりました。代わりにこの回答をお読みください:

https://stackoverflow.com/a/46615878/2398593


@SomeCallMeTime答えは素晴らしく、私たちは仕事で1か月間それを行ってきました.

残念ながら、これは v0.24.x 以降では不可能です(そのコメントを参照してください)。

Githubには、生成されたロックファイルを監視することなく、そのユース ケースを処理する簡単な方法を持つ RFC 提案を含む公開された PR があります。

于 2017-05-23T07:08:02.963 に答える