我想使用“咕哝-贡献-茉莉花”NPM包。它有各种依赖关系。依赖关系图的一部分是这样的:
─┬ grunt-contrib-jasmine@0.4.1
│ ├─┬ grunt-lib-phantomjs@0.2.0
│ │ ├─┬ phantomjs@1.8.2-2
不幸的是,这个版本的phantomjs有一个错误,阻止它在Mac OS x上正确安装。这在最新版本中得到了修复。
我怎么能让grunt-lib-phantomjs使用一个新的版本的phantomjs?
一些附加上下文:
Grunt-contrib-jasmine明确要求版本为“~0.2.0”的grunt-lib-phantomjs,它明确要求版本为“~1.8.1”的phantomjs。
首先将phantomjs添加到包的依赖项中没有效果;两个版本都安装了,而unt-contrib-jasmine仍然使用旧版本(参见:当使用NPM安装一个包时,你可以告诉它使用一个依赖项的不同版本吗?)
唯一适合我的解决方案(节点12。npm 6.x)使用了@Rogerio Chaves开发的npm-force-resolution。
首先,通过以下方法安装:
npm install npm-force-resolutions --save-dev
如果某些损坏的传递依赖脚本阻止您安装任何东西,您可以添加——ignore-scripts。
然后是包装。Json定义什么依赖应该被覆盖(你必须设置准确的版本号):
"resolutions": {
"your-dependency-name": "1.23.4"
}
在“脚本”部分添加新的preinstall条目:
"preinstall": "npm-force-resolutions",
现在,npm install将应用更改,并强制your- dependencies -name为所有依赖项的1.23.4版本。
基于其余的答案,我提供了相同的解决方案,但是我显示了包。json,因为我有点纠结于在哪里放置覆盖以及如何放置。
{
"name": "my-app",
"version": "snapshot",
"scripts": {
"ng": "ng",
"build-dev": "ng build --configuration development",
},
"private": true,
"dependencies": {
"@angular/animations": "~14.2.9",
"@angular/common": "~14.2.9"
...
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.8",
....
},
"overrides": {
"loader-utils@>2.0.0 <3": "2.0.4",
"loader-utils@>3.0.0 <4": "3.2.1"
}
}
对于2022年11月的“loader-utils”安全漏洞,已被要求
如果您在2中,请使用2.0.4版本。X
如果您是3版本,请使用3.2.1版本。X
为了验证
添加包。Json覆盖标签
删除package-lock.json
执行"npm install"
执行“npm audit”
你可以使用npm shrinkwrap功能,以覆盖任何依赖项或子依赖项。
我刚在我们的一个小项目里做过这个。从2.7.3开始,我们需要一个更新的connect版本。给我们带来了麻烦。所以我创建了一个名为npm-shrinkwrap.json的文件:
{
"dependencies": {
"grunt-contrib-connect": {
"version": "0.3.0",
"from": "grunt-contrib-connect@0.3.0",
"dependencies": {
"connect": {
"version": "2.8.1",
"from": "connect@~2.7.3"
}
}
}
}
}
NPM应该在为项目安装时自动拾取它。
(参见:https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/)
用完全不同的包进行嵌套替换
如果你只是对覆盖包的版本号感兴趣,其他答案中列出的大多数策略都很有效,但在我们的例子中,我们需要找到一种方法,用不同的包覆盖嵌套的npm子依赖项。关于你为什么想要这样做的详细信息,请参考以下问题:
如何重写一个嵌套的npm子依赖与完全不同的包(不仅仅是不同的包版本号)?
直接指定tarball
对于使用其他人提到的npm-force-resolutions策略将一个包嵌套替换为一个完全不同的包,您只需要提供一个指向tarball的链接,通常在该链接中指定覆盖版本号。
以替换易受攻击的包ansi-html为例,使用此包的固定分支ansi-html-community,即包的决议部分。Json应该是这样的:
"resolutions": {
"ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
}
要找到到tarball的链接,使用以下命令,并根据需要修改注册表:
npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/
另外,要让npm-force-resolutions在你运行npm install时正常工作,你需要在package.json的scripts部分下有一个preinstall入口:
"scripts": {
"preinstall": "npx npm-force-resolutions"
}