Yarn: 新しい依存関係を追加しても、解像度の既存のバージョン制約は尊重されません

作成日 2017年10月11日  ·  4コメント  ·  ソース: yarnpkg/yarn

機能をリクエストしバグを報告しますか?
バグ。

現在の動作は何ですか?
Yarnは、新しく追加された依存関係の依存関係を解決するときに、すでに追加されているバージョンロックを尊重しません。

現在の動作がバグである場合は、再現する手順を提供してください。

  1. 空のモジュールを初期化します
  2. 反応15.6.1を追加yarn add [email protected]
  3. ストーリーブックを追加yarn add [email protected]
  4. バグが再現され、2つの反応する異なるバージョンがインストールされます。
$ yarn list react
yarn list v1.1.0
├─ [email protected]
└─ [email protected]
   └─ [email protected]
✨  Done in 0.24s.

期待される動作は何ですか?
すべてのバージョンの制約を満たすことができるため、 react @ 15.6.1のみがインストールされることが期待されます。 これは、両方の依存関係がpackage.jsonとyarn installれた後、 yarn.lockを削除するとどうなるかです。

$ rm -rf node_modules/ yarn.lock && yarn install && yarn list react
yarn list v1.1.0
└─ [email protected]
✨  Done in 0.17s.

node.js、yarn、およびオペレーティングシステムのバージョンをお知らせください。

$ node --version
v6.9.4
$ yarn --version
1.2.0
$ system_profiler SPSoftwareDataType|grep "System Version"
      System Version: macOS 10.12.6 (16G29)

編集:元の再現はyarn v.1.1.0で行われましたが、1.2.0にアップグレードしたところ、これはまだ再現されています。

cat-bug high-priority triaged

最も参考になるコメント

今日これを調べます👍

全てのコメント4件

私はこれを掘り下げています...

PackageResolver.getHighestRangeVersionMatch(name, range, manifest)渡されたパラメータが正しくない可能性があることに気づきました。 渡されたrangeは、要求された範囲( ^15.5.4 )ではなく、実際に解決された単一バージョン( 15.6.2 )のようです。

これは、現在インストールされているバージョンがsemverの範囲に一致するかどうかを確認する行まで構築されます。 semver.maxSatisfying(["15.6.1"], '15.6.2'); // null正しい範囲が渡された場合、 semver.maxSatisfying(["15.6.1"], '^15.5.4'); // 15.6.1が実行されます。この問題を解決します。

コードをバックトラックし続けます...

OK、これは#3729、特にpackage-request.js行によって導入されたようです:

const solvedRange = semver.validRange(range) ? info.version : range;

したがって、範囲( ^15.5.4 )が有効な場合は、代わりにinfo.version15.6.2 )を使用します。
インストールされているバージョンが15.6.2一致するかどうかを確認するために、それが渡されます。

const maxValidRange = semver.maxSatisfying(['15.6.1'], '15.6.2'); // null

@arcanisリンクされたPRはあなたのものだったようです。 私は何かを変更することを躊躇しており、そのPRが修正したものは何でも再開するリスクがあります。 手を貸していただけませんか。

今日これを調べます👍

すっごく、それを修正してみましょう! 私はそのようなパッケージは、(私の言葉をマーク-私たちはこれを修正しても、彼らは将来的に再び壊れる)の巻上げに依存しているませんが、私たちはそれができるよりも、それはあまり効率的にはどちらかの素晴らしいではありません。 #5561に付けたものを再投稿する:

私は上記の論理を本当に理解していません。 rangeが有効なsemverである場合、それを使用しないでください。

そうです、それはあまり意味がありません:/私がやりたかったのは、「これがバージョンではなく範囲である場合は、可能であれば、すでに持っているものを使用する」ことだったと思います(目標からPRの目的は、ロックファイルから読み取るときに最適化を行わないことでした)。 そのため、条件はおそらく次のようになります。

const solvedRange = semver.valid(range) && !semver.validRange(range) ? range : info.version;
このページは役に立ちましたか?
0 / 5 - 0 評価