1. ホーム
  2. node.js

[解決済み] yarn` でネストされた依存性を上書きするには?

2023-02-09 07:56:31

質問

私のパッケージが以下の依存関係を持っている場合

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

そして、その foobar パッケージには以下の依存関係があります。

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

と、最近リリースされたバージョンの baz2.1.0 の最初の実行は yarn をインストールします。 [email protected]foobar/node_modules .

どのようにすれば、yarn が強制的に [email protected] パッケージで foobar ?

私の理解では、これは npm shrinkwrap (ラ この質問 ).


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

どのように解決するのですか?

実際に、どのバージョンを受け入れるかについて過度に制限しているサブ依存関係がある場合、次のようにします。 ができます。 yarn を使ってそれらを上書きすることができます。

UPDATED EDITです。 1.0からYarnになりました。 を正式にサポートしました。 を公式にサポートしています。ですから、resolutionを上書きする方法は、以下のようなブロックを package.json :

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

時々、互換性のないバージョンの警告が出ますが、いくつかのパッケージ (socket.io など) は を超える しかし、いくつかのパッケージ (socket.io など) は、受け入れるバージョンを過度に制限しているため、実際に物事を壊さない場合は、喜んで最新バージョンを選択します。

オリジナルの、しかし古くなった回答を以下に示します。

元の質問が正確でなかったようですが、元の質問 は、私が答えて欲しかったもので、答えを見つけたので、後学のためにここに掲載します。

私は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 オプションを見つけました。これは、yarn がプロジェクト全体で各パッケージを1つ以上選択しないように強制します。古いパッケージと新しいパッケージの間に非互換性があるケースは実際にあると思うので、これは私にはやりすぎのように思えます。私はただ、クライアントコードから冗長なパッケージを排除して、ダウンロードを小さくしたかっただけです。 作業 を正しく動作させたいのです。

しかし、ドキュメントでは yarn --flat package.json に入れることができる "resolutions" ブロックへの参照を発見しました。

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

ということで、試しに "component-emitter" : "1.2.1" をパッケージ.json の新しい "resolutions" ブロックに置いてみたところ、実際に component-emitter をそれを必要とするすべての場所で 1.2.1 にフラット化し、今では私のクライアント コードに 1 つだけコピーが存在することになりました。

(そして今 resolutions ブロックが完全にサポートされ yarn で完全にサポートされています。 --flat .)