纱线安装了2个版本的jquery.为什么,除了直接编辑yarn.lock之外我该怎么办?

use*_*142 6 jquery npm package.json yarnpkg

yarn add foo
yarn add jquery-form
yarn add jquery@2.2.4
Run Code Online (Sandbox Code Playgroud)

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 ".."
Run Code Online (Sandbox Code Playgroud)

所以,在productuion jquery-form3.3.1,而foo得到2.2.4.我现在有2个不同的jqueries,这是不好的:)

我修好了

jquery@2.2.4, jquery@>=1.11.1, jquery@>=1.7.2, "jquery@>=2.2.0 <3.0.0":
  version "2.2.4"
  resolved "..."
Run Code Online (Sandbox Code Playgroud)

2.2.4现在一切都得到了重温.但我yarn.lock不是你应该手动编辑的东西.

我该怎么解决?

use*_*142 6

TL; TR:"resolutions": { "jquery": "2.2.4" }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
Run Code Online (Sandbox Code Playgroud)

对于服务器,这是可以的,但对于客户端,则不是。因此,他们使用bower产生平坦依赖的方式:每个库只有一个版本。解决所有冲突是开发人员的责任。

如今bower已不推荐使用npm(3+)并yarn以平面模式id解析依赖项,但它们不能,但是如果yarn不能做到这一点-您jquery又有两个版本。

一个可以迫使纱线使用扁平模式: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"
Run Code Online (Sandbox Code Playgroud)

我不知道为什么无法解决该问题2.2.4(我们应该问semver我相信的作者),但是请单击2此处yarn将您的选择保存到package.json(不yarn.lock!)。

"author": "Foo",
"license": "UNLICENSED",
"resolutions": {
  "jquery": "2.2.4"
}
Run Code Online (Sandbox Code Playgroud)

问题解决了。这是好事,用yarn --flat所有的客户端代码。