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

时间:2016-10-24 20:06:15

标签: node.js npm npm-shrinkwrap yarnpkg

如果我的包有这些依赖

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

foobar包具有这些依赖性

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

baz的最新发布版本为2.1.0,第一轮yarn将在baz@2.1.0中安装foobar/node_modules

如何强制纱线使用baz@2.0.9的{​​{1}}包?

我的理解是,使用foobar(la this question)可以做到这一点。

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

3 个答案:

答案 0 :(得分:67)

如果你确实在它接受的版本中有一个过度限制的子依赖,你可以使用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"

因此它在我的客户端代码中包含了两个组件发射器副本。我看了一下,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 --flat的文档中,我找到了一个可以放在package.json中的“resolution”块的引用:

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

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

更新编辑:现在,从1.0开始,officially supports上面的“分辨率”阻止了。所以就这样使用它。

答案 1 :(得分:31)

现在可以使用纱线selective version resolution feature

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

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

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

答案 2 :(得分:4)

@SomeCallMeTime' answer非常棒,我们一个月都在工作。

不幸的是,自v0.24.x 以后就不再可能了(请参阅comment)。

有一个打开的PR on Github,其中包含一个RFC提案,可以通过简单的方式处理该用例,而无需关注生成的锁定文件。