我想使用grunt-contrib-jasmine
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"
的{{1}}版本明确要求grunt-lib-phantomjs
版本"~1.8.1"
。phantomjs
添加到我的包的依赖项中无效;已安装这两个版本且phantomjs
仍使用旧版本(请参阅:When installing a package with NPM, can you tell it to use a different version of one of its dependencies?)。答案 0 :(得分:208)
您可能已经找到了解决方法。
无论如何,您可以使用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/)
答案 1 :(得分:54)
对于2018年及以后的人,使用npm版本5或更高版本:编辑package-lock.json
:从"requires"
部分删除库并将其添加到"依赖关系"。
例如,您希望deglob
包使用glob
包版本3.2.11
而不是其当前版本。您打开package-lock.json
并查看:
"deglob": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
"integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
"requires": {
"find-root": "1.1.0",
"glob": "7.1.2",
"ignore": "3.3.5",
"pkg-config": "1.1.1",
"run-parallel": "1.1.6",
"uniq": "1.0.1"
}
},
从"glob": "7.1.2",
移除"requires"
,使用正确的版本添加"dependencies"
:
"deglob": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
"integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
"requires": {
"find-root": "1.1.0",
"ignore": "3.3.5",
"pkg-config": "1.1.1",
"run-parallel": "1.1.6",
"uniq": "1.0.1"
},
"dependencies": {
"glob": {
"version": "3.2.11"
}
}
},
现在移除您的node_modules
文件夹,运行npm install
,它会在"dependencies"
部分添加缺少的部分。
答案 2 :(得分:22)
唯一适用于我的解决方案(节点12.x,npm 6.x)使用的是npm-force-resolutions开发的@Rogerio Chaves。
首先,通过以下方式安装它:
npm install npm-force-resolutions --save-dev
如果某些损坏的传递依赖项脚本阻止您安装任何内容,则可以添加--ignore-scripts
。
然后在package.json
中定义应重写的依赖项(您必须设置确切的版本号):
"resolutions": {
"your-dependency-name": "1.23.4"
}
并在"scripts"
部分中添加新的预安装条目:
"preinstall": "npx npm-force-resolutions",
现在,npm install
将应用更改并强制your-dependency-name
的所有依赖项都使用版本1.23.4
。
答案 3 :(得分:6)
对于那些使用纱线的人。
我尝试使用npmrinkwraprap,直到发现yarn cli忽略了我的npm-shrinkwrap.json文件。
纱线有https://yarnpkg.com/lang/en/docs/selective-version-resolutions/。整洁。
答案 4 :(得分:0)
NPM shrinkwrap为这个问题提供了一个很好的解决方案。 它使我们可以覆盖特定子模块的特定依赖项的版本。
基本上,当您运行npm install时,npm首先会在您的根目录中查找是否存在npm-shrinkwrap.json文件。如果是这样,它将首先使用它来确定程序包的依赖性,然后返回到处理package.json文件的正常过程。
要创建npm-shrinkwrap.json,您要做的就是
npm shrinkwrap --dev
代码:
{
"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"
}
}
}
}
}
答案 5 :(得分:0)
我找到了对我有用的解决方案。
所以。首先按照所有其他建议的解决方案编辑npm-shrinkwrap.json文件。
然后,(在Windows上):
如果仅执行一次'npm install'操作,则其他建议的解决方案就足够了。 但是,在第一次“ npm安装”之后,文件“ npm-shrinkwrap.json”会像修改之前一样再次被修改。
答案 6 :(得分:0)
我遇到一个问题,其中一个嵌套依赖项具有一个npm审核漏洞,但是我仍然想维护父依赖项版本。 npmrinkwrap解决方案对我不起作用,所以我做了什么来覆盖嵌套的依赖版本:
答案 7 :(得分:-2)
最简单的最小值是仅将初始的收缩包装依赖项json添加到package.json。所需的“从”和“至”
"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"
}
}
}