web-dev-qa-db-ja.com

ネストされた依存関係を `yarn`でオーバーライドするにはどうすればよいですか?

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

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

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

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

bazの最新リリースバージョンは2.1.0であり、yarnの最初の実行では[email protected]foobar/node_modulesにインストールされます。

foobar[email protected]パッケージを使用するようヤーンに強制するにはどうすればよいですか?

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


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

59
Chris W.

実際に、どのバージョンを受け入れるかについて過度に制限されているサブ依存性がある場合、canを使用してそれらをオーバーライドします。元の質問は正確ではなかったようですが、元の質問は実際には答えたがっていたので、答えを見つけました。

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

[email protected]:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

[email protected]:
  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ファイルを変更してみました:

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

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

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

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

だから、package.jsonの新しい「解像度」ブロックに"component-emitter" : "1.2.1"を入れてみましたが、実際には、それを必要とするすべての場所でコンポーネントエミッターを1.2.1にフラット化しました。クライアントコード。

UPDATED EDIT:ヤーン、1.0の時点で 公式にサポート 上記の「解像度」ブロック。それを使ってください。

72
SomeCallMeTim

これは現在、yarnの 選択的バージョン解決機能 で可能です。

プロジェクトのpackage.jsonで、resolutionsを使用します。

  "resolutions": {
    "foobar/**/baz": "2.0.9"
  }

これは、foobarのパッケージbaz(およびその下にある他のパッケージ)バージョンをオーバーライドし、バージョン2.0.9に強制します。

31
Tom Hale

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

残念なことに、これはv0.24.x以降では不可能です( コメント を参照)。

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

3
maxime1992