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

gj3fmq9x  于 2023-04-30  发布在  Yarn
关注(0)|答案(3)|浏览(220)

如果我的包有这些依赖项

{ "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将在foobar/node_modules中安装baz@2.1.0
如何强制yarn将baz@2.0.9包用于foobar
我的理解是,这将是可能的使用npm shrinkwrap(一个la this question)。
我的问题的总结可能是:Yarn创建了可重复的、确定性的安装,但我如何定制该安装呢?

bihw5rsg

bihw5rsg1#

如果你确实有一个子依赖项,它在接受什么版本上有过度的限制,你可以使用yarn覆盖它们。

**更新编辑:**Yarn now,as of 1.0,officially supports“resolutions”块。因此,覆盖分辨率的方法是向package.json添加这样的块:

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

您有时会收到“不兼容”版本的警告,但我发现有些软件包(如 www.example.com )在他们接受的版本上过于严格,所以我很乐意选择最新版本,因为它实际上不会破坏东西。

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

听起来原来的问题并不完全正确,但原来的问题实际上是我想要回答的问题,我找到了答案,所以在这里给后代:
我用的是 www.example.com 。但它需要两个版本。这是什么Yarn。锁文件看起来像我改变任何东西之前:

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。锁定文件:

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的文档中,我发现了一个可以放在包中的“resolutions”块的引用。json:

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

因此,我尝试将"component-emitter" : "1.2.1"放在软件包中一个新的“resolutions”块中。JSON,它实际上将component-emitter展平为1。2.1为所有需要它的地方,现在我只有一个副本在我的客户端代码。
(And现在yarn完全支持resolutions块,所以你甚至不需要使用--flat。)

c3frrgcw

c3frrgcw2#

现在可以使用yarn的selective version resolution feature
在项目的 main(root)package.json中,使用resolutions

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

这将覆盖foobar包(以及它下面的任何其他包)的baz版本,强制它成为版本2。0.9.

w1e3prcc

w1e3prcc3#

编辑:现在不推荐使用,请阅读以下答案:
https://stackoverflow.com/a/46615878/2398593
@SomeCallMeTime的answer很棒,我们已经在工作中这样做了几个月了。
不幸的是,这是不可能的,因为v0。24.x(见该评论)。
有一个开放的PR on Github,其中有一个RFC提议,它有一个简单的方法来处理用例,而不必关注生成的锁文件。

相关问题