如何用`yarn`覆盖嵌套的依赖项?

Chr*_* W. 64 node.js npm npm-shrinkwrap yarnpkg

如果我的包有这些依赖项

{ "name": "my-package",
  "dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }
Run Code Online (Sandbox Code Playgroud)

并且foobar包具有这些依赖性

{ "name": "foobar",
  "dependencies": { "baz":"^2.0.0" }
Run Code Online (Sandbox Code Playgroud)

和最近发布的版本baz2.1.0,第一次运行yarn将安装baz@2.1.0foobar/node_modules.

如何强制纱线使用baz@2.0.9包装foobar

我的理解是这可以使用npm shrinkwrap(这个问题).


我的问题的摘要可能是:Yarn创建可重复的,确定性的安装,但我如何自定义该安装?

Som*_*Tim 82

如果你确实有一个子依赖关系,它将接受哪个版本过于严格,你可以使用yarn覆盖它们.这听起来像原来的问题是不完全正确的,但原来的问题实际上是一个我想回答,我找到了答案,所以这里是为后人:

我正在使用socket.io库,它具有component-emitter依赖性.但它有一对它需要的版本.这是在我更改任何内容之前yarn.lock文件的样子:

component-emitter@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

component-emitter@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"
Run Code Online (Sandbox Code Playgroud)

所以它在我的客户端代码中包含了两个组件发射器副本.我看了一下,1.1.2和1.2.0(或1.2.1,当前)之间似乎没有任何重大变化.我首先尝试更改yarn.lock文件:

component-emitter@1.2.1, component-emitter@^1.2.1, component-emitter@1.1.2:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
Run Code Online (Sandbox Code Playgroud)

这有效,但该文件有关于它自动生成的警告,这意味着我添加的每个更新或新包将踩到这个更改.一些搜索找到了该yarn --flat选项,这将迫使纱线在整个项目中选择不超过每个包的一个.这对我来说似乎有些过分,因为我确信旧包和新包之间存在不兼容的实际情况.我只是想从我的客户端代码中删除冗余包,以使下载更小; 我仍然希望开发包能够正常工作.

但在文档到纱线--flat我发现一个"决议"块,可以在去的package.json参考:

"resolutions": {
  "package-a": "2.0.0",
  "package-b": "5.0.0",
  "package-c": "1.5.2"
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试"component-emitter" : "1.2.1"在我的package.json中添加一个新的"resolution"块,事实上它实际上将所有需要它的组件发射器扁平化为1.2.1,现在我的客户端代码中只有一个副本.

更新编辑:从1.0开始,纱线正式支持上面的"决议"块.所以就这样使用它.

  • 非常感谢您的回答。因此,我认为解决方案至少部分是“编辑yarn.lock文件”,这是我一开始担心的事情。但这是有道理的,纱线不会竭尽全力地核对那个文件。 (2认同)

Tom*_*ale 34

现在可以使用纱线的选择性版本分辨率功能.

在您的项目中package.json,使用resolutions:

  "resolutions": {
    "foobar/**/baz": "2.0.9"
  }
Run Code Online (Sandbox Code Playgroud)

这会覆盖包foobar的(及其下的任何其他包)版本baz,强制它为2.0.9版.

  • @Marecky 它确实适用于工作区,但您必须将分辨率放在顶层 package.json 中 (13认同)
  • 不适用于工作区:( 请参阅上面我的评论。 (2认同)
  • 对我来说问题是正在使用的依赖的已弃用的包已被重命名/替换为完全不同的东西。因此“parent”将“libA”列为依赖项。但“libA”已被弃用并重命名为“libB”。如何告诉“parent”使用“libB”? (2认同)
  • 它在 Yarn 3 中不起作用。运行 `yarn` 时使用 `**` 会导致以下错误:`预期为“@”、[^/@],或输入结束但找到了“/”` (2认同)