您是否要请求功能或报告错误?
漏洞。
目前的行为是什么?
在解决新添加的依赖项的依赖项时,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.
预期的行为是什么?
预期仅安装[email protected] ,因为它可以满足所有版本限制。 如果我在两个依赖项都在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)
编辑:原始的repro是用yarn v.1.1.0完成的,但是我升级到1.2.0,并且仍然可以复制。
我正在研究这个...
注意到传递给PackageResolver.getHighestRangeVersionMatch(name, range, manifest)
可能不正确。 传递的range
似乎是实际解析的单个版本( 15.6.2
),而不是请求的范围( ^15.5.4
)。
依次建立到该行,以检查当前安装的版本是否与semver范围匹配: semver.maxSatisfying(["15.6.1"], '15.6.2'); // null
如果传递了正确的范围,则它将执行semver.maxSatisfying(["15.6.1"], '^15.5.4'); // 15.6.1
,应解决这个问题。
我将继续回溯代码...
好吧,它看起来像是由#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;
最有用的评论
今天将调查这个👍