機能をリクエストしバグを報告しますか?
バグ。
現在の動作は何ですか?
Yarnは、新しく追加された依存関係の依存関係を解決するときに、すでに追加されているバージョンロックを尊重しません。
現在の動作がバグである場合は、再現する手順を提供してください。
yarn add [email protected]
yarn add [email protected]
$ 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にアップグレードしたところ、これはまだ再現されています。
私はこれを掘り下げています...
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.version
( 15.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;
最も参考になるコメント
今日これを調べます👍