如何覆盖嵌套的NPM依赖项版本?

时间:2013-04-04 08:30:15

标签: node.js npm

我想使用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

一些额外的背景:

8 个答案:

答案 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/。整洁。

也请查看以下答案:https://stackoverflow.com/a/41082766/3051080

答案 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-shrinkwrap.json”文件
  • 属性
  • 在“属性”下,选择“只读”。 这样可以防止npm修改mpn-shrinkwrap.json文件。

如果仅执行一次'npm install'操作,则其他建议的解决方案就足够了。 但是,在第一次“ npm安装”之后,文件“ npm-shrinkwrap.json”会像修改之前一样再次被修改。

答案 6 :(得分:0)

我遇到一个问题,其中一个嵌套依赖项具有一个npm审核漏洞,但是我仍然想维护父依赖项版本。 npmrinkwrap解决方案对我不起作用,所以我做了什么来覆盖嵌套的依赖版本:

  1. 删除package-lock.json中“ requires”部分下的嵌套依赖项
  2. 在package.json的DevDependencies下添加更新的依赖项,以便需要它的模块仍然可以访问它。
  3. npm我

答案 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"
    }
  }
}