当前位置: 首页 > 面试题库 >

如何使用`yarn`覆盖嵌套的依赖关系?

淳于乐池
2023-03-14
问题内容

如果我的包裹有这些依赖

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

foobar包有这些依赖

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

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

如何强制纱线将其用于baz@2.0.9包装foobar

我的理解是,使用npm shrinkwrap可以做到这一点。

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


问题答案:

如果实际上您确实对要接受的版本具有过分的限制,则 可以 使用yarn覆盖它们。

更新编辑: 从1.0开始,Yarn现在正式支持 “ resolutions”块。因此,覆盖分辨率的方法是将这样的代码块添加到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选项,这将迫使纱线在整个项目中选择不超过每个卷装之一。在我看来,这似乎有些过激,因为我敢肯定,实际情况下,旧版本和新版本的软件包之间是不兼容的。我只是想从我的客户端代码中删除一个多余的软件包,以减小下载量。我仍然希望所有开发包都能
正常工作

但是在有关--flat的文档中,我找到了可以在package.json中使用的“ resolutions”块的引用:

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

因此,我尝试"component-emitter" : "1.2.1"在package.json中放入一个新的“
resolutions”块,实际上对于需要它的所有位置,它都将组件发射器展平为1.2.1,现在我的客户端代码中只有一个副本。

(现在该resolutions块已完全受支持yarn,因此您甚至不需要使用--flat。)



 类似资料:
  • 问题内容: 我想使用NPM软件包。它具有各种依赖性。依赖图的一部分如下所示: 不幸的是,此版本中存在一个错误,导致该错误无法在Mac OS X上正确安装。此问题已在最新版本中修复。 如何获得更新版本的? 一些其他上下文: 明确要求版本为,明确要求版本为。 首先添加到我程序包的依赖项没有任何作用;这两个版本均已安装,并且仍使用旧版本 问题答案: 您可以使用npm收缩包装功能,以覆盖任何依赖性或子依赖

  • 问题内容: 这是为这篇文章准备的一个通用的虚构示例。考虑6节课 是外部类,假设它为数据库表保留一个对象。 在此,没有呼叫或或。我的目标是外部范围不需要的内部对象的示例。 是内取和操作的数据,因此需要,和。 包含和需要,和。 若要让事情变得有趣,它需要一个Logger。我的示例现在深了3个作用域。 **我的问题很简单,如果您有一个对象3(或更多)作用域,而外部作用域上的对象没有调用该对象,那么如何将

  • 问题内容: 在其中,您可以选择覆盖依赖项,并使其指向其他存储库,例如在以下https://github.com/kubermatic/glog- logrus 库中,您需要在Gopkg.toml文件中添加以下几行: 然后在代码库中。但是,在go模块中,我看不到这样的选择吗?这使我认为唯一的解决方案是将import更改为。 谢谢! 问题答案: 这就是指令的目的。 引用Wiki Go 1.11模块:我

  • 我正在开发一个应用程序,使用我的另一个项目作为maven依赖项。 期望 我希望我的依赖项使用自己的回退.xml登录自己的文件。我希望应用程序使用自己的 logback.xml文件登录到控制台和一个与依赖项不同的文件。我希望这两个文件都位于应用程序jar附近的日志文件夹中。 它现在做什么 但是目前,应用程序和依赖项都使用应用程序的logback.xml,所有内容都记录在控制台和同一个文件中。 我该如

  • 如果我有一个OSGI Bundle jar中嵌套了依赖项jar,我是否需要在导入包清单中列出这些类以便使用它们?我不这么认为。 另外,我如何将这些依赖项jar添加到我的包中。我只是把它们放在根文件夹里吗?我是否需要向清单文件添加任何内容才能使用这些依赖关系?

  • 一些额外的上下文: 显式要求的版本,显式要求的版本. 首先向我的包的依赖项添加没有效果;这两个版本都已安装,仍然使用旧版本(请参见:使用NPM安装包时,是否可以告诉它使用其依赖项的不同版本?)。