Yarn: 添加新的依存关系不遵循现有的版本限制

创建于 2017-10-11  ·  4评论  ·  资料来源: yarnpkg/yarn

您是否要请求功能或报告错误
漏洞。

目前的行为是什么?
在解决新添加的依赖项的依赖项时,Yarn不遵守已添加的版本锁。

如果当前行为是错误,请提供重现步骤。

  1. 初始化一个空模块
  2. 添加反应15.6.1 yarn add [email protected]
  3. 添加[email protected] yarn add [email protected]
  4. 该错误再现并安装了两个对不同版本的反应:
$ 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,并且仍然可以复制。

cat-bug high-priority triaged

最有用的评论

今天将调查这个👍

所有4条评论

我正在研究这个...

注意到传递给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;
此页面是否有帮助?
0 / 5 - 0 等级