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
不幸的是,在这个版本中有一个bug
phantomjs
,它阻止了它在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

    Just
    git 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",