yarn 安装了 2 个版本的 jquery。为啥,除了直接编辑 yarn.lock 之外,我该如何修复它?

Posted

技术标签:

【中文标题】yarn 安装了 2 个版本的 jquery。为啥,除了直接编辑 yarn.lock 之外,我该如何修复它?【英文标题】:yarn installed 2 versions of jquery. Why, and how can I fix it except directly editing yarn.lock?yarn 安装了 2 个版本的 jquery。为什么,除了直接编辑 yarn.lock 之外,我该如何修复它? 【发布时间】:2018-08-03 16:19:01 【问题描述】:
yarn add foo
yarn add jquery-form
yarn add jquery@2.2.4

foo 声明依赖 "jquery@>=2.2.0 <3.0.0"jquery-form 声明 jquery@>=1.7.2

在我看来我应该有jquery@2.2.4,但这是我的yarn.lock

jquery@2.2.4, "jquery@>=2.2.0 <3.0.0":
  version "2.2.4"
  resolved "..."

jquery@>=1.11.1, jquery@>=1.7.2:
  version "3.3.1"
  resolved ".."

所以,在生产中jquery-form 得到了3.3.1,而foo 得到了2.2.4。 我现在有 2 个不同的 jquery,这不好:)

我用

修复了它
jquery@2.2.4, jquery@>=1.11.1, jquery@>=1.7.2, "jquery@>=2.2.0 <3.0.0":
  version "2.2.4"
  resolved "..."

现在2.2.4 上的所有内容都已更新。但我yarn.lock 不是你应该手动编辑的东西。

我该如何解决?

【问题讨论】:

【参考方案1】:

TL;TR: "resolutions": "jquery": "2.2.4" in package.json

原始npm(3.0 之前)用于以树模式(某种并排)安装所有依赖项。在过去,如果模块 A 依赖于 jquery-1 并且模块 B 依赖于 jquery-2 npm 做了以下操作

node_modules/A/node_modules/jquery-1
node_modules/B/node_modules/jquery-2

这对服务器来说可以,但对客户端来说不行。所以他们使用了bower,它产生了flat依赖:每个库只有一个版本。解决所有冲突是开发人员的职责。

现在 bower 已被弃用,npm (3+) 和 yarn 都可以在平面模式 id 中解决依赖关系,但如果 yarn 不能这样做 - 你有两个版本的 @987654335再次@。

可以强制纱线使用扁平模式:yarn --flat。它会询问你每一个冲突:

info Unable to find a suitable version for "jquery", please choose one by typing one of the numbers below:
 1) "jquery@2.2.4, jquery@>=2.2.0" which resolved to "2.2.4"
 2) "jquery@>=1.7.2, jquery@>=1.11.1, jquery@>=1.7.2" which resolved to "3.3.1"

我不知道为什么不能解析到2.2.4(我们应该问semver作者我相信)),但是点击这里2yarn会将你的选择保存到package.json(不是yarn.lock!)。

"author": "Foo",
"license": "UNLICENSED",
"resolutions": 
  "jquery": "2.2.4"

问题解决了。对于所有客户端代码,最好使用yarn --flat

【讨论】:

以上是关于yarn 安装了 2 个版本的 jquery。为啥,除了直接编辑 yarn.lock 之外,我该如何修复它?的主要内容,如果未能解决你的问题,请参考以下文章

yarn 的优势

升级Yarn 2,摆脱node_modules

使用yarn代替npm进行前端包管理

你好 Yarn 2,再见 node_modules

当我只需要构建时,为啥 yarn 会安装开发依赖项?

使用 yarn 安装特定版本的包不起作用