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

我想使用grunt-contrib-jasmineNPM软件包。它具有各种依赖性。依赖图的一部分如下所示:

─┬ 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

一些其他上下文:

西门逆天2020/03/19 12:39:48

NPM收缩包装为该问题提供了一个很好的解决方案。它允许我们重写特定子模块的特定依赖项的版本。

本质上,当您运行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"
        }
      }
    }
  }
}
古一蓝染大人别太浪2020/03/19 12:39:48

您可以使用npm收缩包装功能,以覆盖任何依赖性或子依赖性。

我刚刚在我们的一个艰苦的项目中做到了这一点。从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/

蓝染大人飞云2020/03/19 12:39:48

我找到了对我有用的解决方案。

所以。首先根据所有其他建议的解决方案编辑npm-shrinkwrap.json文件。

然后,(在Windows上):

  • 右键单击“ npm-shrinkwrap.json”文件
  • 物产
  • 在属性下,选择“只读”。 这将阻止npm修改mpn-shrinkwrap.json文件。

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

Mandy番长2020/03/19 12:39:48

对于2018年及以后的版本,请使用npm 5或更高版本:编辑package-lock.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"
  }
},

"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"部分添加缺少的部分。

AL村村2020/03/19 12:39:48

对于那些使用纱线的人。

我尝试使用npmrinkwraprap,直到发现yarn cli忽略了我的npm-shrinkwrap.json文件。

毛线对此具有https://yarnpkg.com/lang/zh-CN/docs/selective-version-resolutions/整齐。

也查看此答案:https : //stackoverflow.com/a/41082766/3051080