覆盖 npm 包依赖
Posted
技术标签:
【中文标题】覆盖 npm 包依赖【英文标题】:Override npm package dependency 【发布时间】:2018-11-01 14:27:30 【问题描述】:我读到这个:How do I override nested NPM dependency versions?
很遗憾,它并没有解决我的问题。
我正在尝试将包从使用特定依赖项更改为使用该依赖项的另一个版本。
它是否内置在包中,它应该使用哪个版本的依赖项,或者是否可以更改它?
就我而言,我正在尝试将css-loader
对cssnano@3.10.0
(最新)的默认依赖更改为依赖cssnano@4.0.0-rc.2
(下一个) >)。
从上述链接的第二个答案中,用户 trickpatty 指出:
只要你运行 npm i 而不是编辑你的 package-lock.json 并将子依赖项添加到“依赖项” 在那里,将子依赖项添加到您的 package.json “依赖项” 部分
在 package.json 的 devDependencies 中包含 cssnano@4.0.0-rc.2
对 css-loader
没有任何作用。它仍然使用 cssnano
的另一个(默认)版本。
【问题讨论】:
“它是否内置在包中,它应该使用哪个版本的依赖项” “是否可以改变它” @Phil 如果您运行npm list cssnano
,您将看到安装了两个版本的 cssnano,但 css-loader 确实仍然依赖于较低版本(它显示为“子文件夹”)
@Phil “鉴于 NPM 的平面目录结构” - 嗯,NPM 以高度嵌套的目录结构着称,每个包都可以安装多个版本。你在想别的吗?
@Magnus Phil 完全错误。每个包首先使用其嵌套的依赖项
@StopHarmingMonica 我只是按照我当时认为的所见。我可以发誓一切都在node_modules
的顶层。我也很高兴在这里错了。很高兴我当时没有提供答案:)。 编辑: 很确定这就是我所看到的~npm.github.io/how-npm-works-docs/npm3/how-npm3-works.html,显然我很困惑
【参考方案1】:
NPM 8 引入了“覆盖”,它允许您覆盖直接依赖项的特定传递依赖项。对于您的用例,您可以在 package.json 中声明如下内容。
"overrides":
"css-loader":
"cssnano": "4.0.0-rc.2"
更多详情@https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides
【讨论】:
【参考方案2】:在 package.json 中你可以添加 resolutions
并给出使用的依赖路径。这是我项目中的示例:
"resolutions":
"helmet/helmet-csp": "2.9.1",
"jest/**/handlebars": "4.5.3"
【讨论】:
这是yarn的特性,不是npm【参考方案3】:这个帖子有点老了,可能已经解决了,但也许有人有同样的问题。
在我看来,您不应该更改依赖项的依赖项版本。每个项目的开发、测试和发布都考虑了它们声明的依赖版本。您可以破坏或更改包的行为,从外部更改其依赖项。
相反,考虑创建一个项目的分支(css-loader),更改依赖版本,自己测试,并使用你的分支。您还可以向项目维护者提出拉取请求(如果您认为更改将使社区受益)或发布您的版本(尊重许可政策)。
【讨论】:
这主要是出于安全目的,否则整个应用程序将处于危险之中,我们不会仅仅因为我们喜欢而改变:)以上是关于覆盖 npm 包依赖的主要内容,如果未能解决你的问题,请参考以下文章