覆盖npm包依赖

18

我读到了这个:如何覆盖嵌套的 NPM 依赖版本?

不幸的是,它没有解决我的问题。

我正在尝试将一个包从使用特定的依赖项更改为使用该依赖项的另一个版本。

一个包内置了使用哪个版本的依赖关系吗?还是可以更改它?

在我的情况下,我正在尝试将 css-loader 的默认依赖项从 cssnano@3.10.0 (最新版本) 更改为依赖于 cssnano@4.0.0-rc.2 (下一步版本)。

从上面链接中的第二个答案中,用户 trickpatty 指出:

  

每次运行npm i时都将删除此内容,而不是编辑您的package-lock.json并向其中添加子依赖项,请将子依赖项添加到您的 package.json "dependencies" 部分。

在 package.json 的 devDependencies 中包含 cssnano@4.0.0-rc.2css-loader 没有任何作用。它仍然使用其他(默认)版本的 cssnano


1
“一个包是否内置了它应该使用的依赖项版本?” <- 是的。 “是否可以更改它?” <- 也是的。 - Phil
1
@Phil 如果你运行 npm list cssnano,你会看到有两个版本的cssnano被安装了,但是css-loader确实仍然依赖于较低的版本(它显示为“子文件夹”)。 - Magnus
1
@Phil “鉴于NPM的扁平目录结构” - 呃,众所周知,NPM具有高度嵌套的目录结构,每个软件包都可以安装多个版本。您是在想其他东西吗? - OrangeDog
1
@Magnus Phil完全是错的。每个包都优先使用其嵌套依赖项。 - OrangeDog
1
@StopHarmingMonica 我只是根据当时看到的东西来说。我本以为一切都在node_modules的顶层。如果我错了,我也很高兴。当时很高兴没有提供答案。_编辑:_我相当确定这就是我所看到的 ~ https://npm.github.io/how-npm-works-docs/npm3/how-npm3-works.html,显然我被搞混了。 - Phil
显示剩余6条评论
5个回答

2

有几种替代方案:

  • 如果你可以使用不同的包管理器,yarn 有一个选项可以通过添加到 package.json 来实现:
"resolutions": {
    "package-a": "2.0.0"
}

如果你可以使用最新的Node LTS和NPM 8:https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides
否则,你可以使用一些工具,例如https://github.com/mislavlukach/flatten-dependencies。该工具在postinstall脚本上运行,以修复不同嵌套依赖项版本的问题。你需要将该版本作为项目的依赖项安装。
编辑:找到另一个替代方案:https://www.npmjs.com/package/npm-force-resolutions

谢谢您,这实际上是最全面的答案,涵盖了几种替代方案。 - runderworld

2
NPM 8引入了“覆盖”功能,允许您覆盖直接依赖的特定传递依赖项。对于您的用例,您可以在package.json中声明类似以下内容。请注意保留HTML标签。
{
  "overrides": {
    "css-loader": {
      "cssnano": "4.0.0-rc.2"
    }
  }
}

更多细节请查看 https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides


我能否以某种方式选择不同的套餐来解决这个问题? - undefined

1
以下是您的package.json中的内容,可以帮助您解决问题。它的工作原理是,它使用您指定的版本覆盖了css-loader请求的所有cssnano版本。 查看文档
"overrides": {
  "css-loader": {
     "cssnano": "1.2.3"
   }
}

-2
package.json 文件中,您可以添加 resolutions 并提供所使用的依赖项的路径。这是我项目的一个示例:
{
  "resolutions": {
    "helmet/helmet-csp": "2.9.1",
    "jest/**/handlebars": "4.5.3"
  }
}

1
这是yarn的一个特性,而不是npm。 - Maddis
如果您想在NPM中使用“resolutions”,则需要与_npm-force-resolutions_(https://github.com/rogeriochaves/npm-force-resolutions)一起使用。这对于支持npm 8.3以下的用户非常有用,因为此时overrides被引入到NPM本身中。但是,应该注意的是,嵌套/通配符表示法将+不会+与_npm-force-resolutions_一起工作,而只能与yarn一起使用,正如这里的第一条评论所正确指出的那样。 - runderworld

-4

这个帖子可能有点旧了,也许已经解决了,但是可能还有人有同样的问题。

在我看来,你不应该改变你的依赖项版本。每个项目都是根据其声明的依赖项版本开发、测试和发布的。改变其依赖关系会破坏或改变包的行为。

相反,考虑创建一个项目分支(css-loader),更改依赖项版本,自己进行测试,并使用你的分支。如果你认为这种更改将有益于社区,你也可以向项目维护者提交拉取请求或发布你的版本(遵守许可政策)。


3
主要出于安全目的才这么做,否则整个应用程序都会面临危险,我们不是因为喜欢而更改 :) - Manoj Ramanan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接