Node.js 如何覆盖嵌套的NPM依赖项版本?
我想使用Node.js 如何覆盖嵌套的NPM依赖项版本?,node.js,npm,Node.js,Npm,我想使用grunt contrib jasmineNPM包。它有各种依赖关系。依赖关系图的一部分如下所示: ─┬ grunt-contrib-jasmine@0.4.1 │ ├─┬ grunt-lib-phantomjs@0.2.0 │ │ ├─┬ phantomjs@1.8.2-2 不幸的是,在这个版本中有一个bugphantomjs,它阻止了它在Mac OS X上的正确安装。这在最新版本中已经修复 如何获得grunt lib phantomjs以使用较新版本的phantomjs? 其他
grunt contrib jasmine
NPM包。它有各种依赖关系。依赖关系图的一部分如下所示:
─┬ grunt-contrib-jasmine@0.4.1
│ ├─┬ grunt-lib-phantomjs@0.2.0
│ │ ├─┬ phantomjs@1.8.2-2
不幸的是,在这个版本中有一个bugphantomjs
,它阻止了它在Mac OS X上的正确安装。这在最新版本中已经修复
如何获得grunt lib phantomjs
以使用较新版本的phantomjs
?
其他一些背景:
明确要求grunt contrib jasmine
grunt lib phantomjs的版本
,该版本明确要求“~0.2.0”
phantomjs的版本
“~1.8.1”
- 首先将
添加到我的包的依赖项中没有效果;这两个版本都已安装,phantomjs
仍使用较旧的版本(请参阅:)grunt contrib jasmine
grunt
项目中完成了这项工作。我们需要更新版本的connect,因为2.7.3
。给我们带来了麻烦。因此,我创建了一个名为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
在为项目安装时应自动拾取它
(请参阅:)对于2018年及以后的版本,请使用npm版本5或更高版本:编辑您的包锁。json
:从“requires”
部分删除库,并将其添加到“dependencies”下
例如,您希望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"
}
},
从“requires”
中删除“glob:”7.1.2“,
,添加具有正确版本的“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\u modules
文件夹,运行npm ci
(或npm install
,对于旧版本的node/npm),它会将缺少的部分添加到“依赖项”
部分。对于使用纱线的用户
我尝试使用npm shrinkwrap,直到发现该文件忽略了我的npm-shrinkwrap.json文件
纱线对此很有吸引力。整洁
也请查看此答案:为这个问题提供了一个很好的解决方案。
它允许我们覆盖特定子模块的特定依赖项的该版本
基本上,当您运行npm安装时,npm将首先查看根目录中是否存在npm-shrinkwrap.json文件。如果确实如此,它将首先使用这个来确定包的依赖关系,然后返回到处理package.json文件的正常过程
要创建npm-shrinkwrap.json,只需
npm shrinkwrap --dev
代码:
我遇到一个问题,其中一个嵌套依赖项存在npm审核漏洞,但我仍然希望维护父依赖项版本。npm shrinkwrap解决方案对我不起作用,因此我如何覆盖嵌套依赖项版本:
删除package-lock.json中“requires”部分下的嵌套依赖项
在package.json中的devdependences下添加更新的依赖项,以便需要它的模块仍然能够访问它
npm i
唯一适合我的解决方案(node 12.x,npm 6.x)是使用由开发的
首先,通过以下方式安装:
npm install npm-force-resolutions --save-dev
如果某些损坏的可传递依赖项脚本阻止您安装任何内容,您可以添加--忽略脚本
然后在package.json
中定义应该覆盖的依赖项(您必须设置确切的版本号):
在“脚本”
部分添加新的预安装条目:
"preinstall": "npx npm-force-resolutions",
现在,npm安装
将应用更改,并强制所有依赖项的依赖项名称
版本为1.23.4
。Justgit clone
或fork required module。您还可以手动删除嵌套的phantomjs
。在0.5.1上,它使用grunt库-phantomjs@0.3.1
,它使用phantomjs@1.9.1-0
:)npm计划在未来发布当我这样做时,只安装了grunt contrib connect
依赖项及其子项。package.json中的所有其他依赖项都没有安装。我与@iDVB有相同的问题。我最终编辑了节点\u模块
目录,以便完整的包覆面提取依赖项转储正是我想要的,而不仅仅是覆盖。但是仍然是一种痛苦的解决方案。@Domi这个文件是通过运行npm shrinkwrap创建的,条目不是手工添加的。不幸的是,正如在那个bug中提到的,对于npm4,最简单的方法不再有效。(当删除node\u模块
时,使用最小的收缩包装运行安装似乎会保留devdependency
不变,尽管忽略依赖项
,但运行另一个安装会删除非显式项,因此现在运行npm收缩包装
很重要,要获得完整文件,请修改文件中的部分。),然后再次运行npm install
)npm 6.4将只覆盖包覆面处理文件并使用过时的依赖项这很好,只要npm install
运行一次。在我的情况下,编辑是必要的,因为嵌套的dep会导致失败。只要您运行npm i
,就会删除此项,而不是编辑package-lock.json并将子依赖项添加到“dependencies”中,而是将子依赖项添加到package.json“dependencies”中Section我已经创建了一个库,可以自动为您实现这一点:它可以工作,但是如果我再次运行npm install
,那么对package lock.json
所做的所有更改都会被还原,我会得到dep的错误版本。我运行npm ci
并且不会触及package lock.json
这有什么不同吗根据目前接受的答案?这个答案有两个upvo
"resolutions": {
"your-dependency-name": "1.23.4"
}
"preinstall": "npx npm-force-resolutions",