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

新手上路,请多包涵

如果我的包有这些依赖

{ "name": "my-package",
  "dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }

foobar 包有这些依赖

{ "name": "foobar",
  "dependencies": { "baz":"^2.0.0" }

and the most recently released version of baz is 2.1.0 , the first run of yarn will install baz@2.1.0 in foobar/node_modules

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

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


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

原文由 Chris W. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 546
2 个回答

如果您确实有一个子依赖项,它在接受哪些版本方面过于严格,您 可以 使用 yarn 覆盖它们。

更新编辑: 从 1.0 开始,Yarn 现在 正式支持“分辨率”块。因此,覆盖分辨率的方法是将这样的块添加到 package.json

 "resolutions": {
      "package-a": "2.0.0",
      "package-b": "5.0.0",
      "package-c": "1.5.2"
}

有时您会收到有关“不兼容”版本的警告,但我发现某些软件包(如 socket.io)在他们接受的版本方面 过于 严格,所以我很乐意选择最新版本,因为它实际上并没有破坏事物。

下面的原始但过时的答案。

听起来原来的问题并不完全正确,但原来的问题 实际上 是我想要回答的问题,我找到了答案,所以这里是为了后代:

我正在使用 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"

所以它在我的客户端代码中包含了组件发射器的两个副本。我看了看,在 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"

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

但是在 yarn –flat 的文档中,我找到了对可以在 package.json 中的“解决方案”块的引用:

 "resolutions": {
  "package-a": "2.0.0",
  "package-b": "5.0.0",
  "package-c": "1.5.2"
}

所以我尝试将 "component-emitter" : "1.2.1" 在我的 package.json 中的一个新的“分辨率”块中,实际上它在所有需要它的地方将组件发射器扁平化为 1.2.1,现在我只有一个副本在我的客户代码中。

(现在 resolutions 块完全支持 yarn ,所以你甚至不需要使用 --flat 。)

原文由 SomeCallMeTim 发布,翻译遵循 CC BY-SA 4.0 许可协议

现在可以使用 yarn 的 选择性版本解析功能

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

   "resolutions": {
    "foobar/**/baz": "2.0.9"
  }

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

原文由 Tom Hale 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题