如何重写嵌套NPM的依赖版本?如何重写嵌套NPM的依赖版本?(How do I override n

2019-05-06 15:59发布

我想用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"grunt-lib-phantomjs ,其中明确要求版本"~1.8.1"phantomjs
  • 添加phantomjs我包的相关性第一没有影响; 两个版本的安装和grunt-contrib-jasmine仍然使用旧版本(参见: ?当NPM安装包,你可以告诉它使用一个不同的版本它的一个依赖的 )。

Answer 1:

你可能已经找到了一种解决方法了。

无论如何,你可以使用NPM拆封功能,以覆盖任何依赖关系或子依赖。

我只是在我们的一咕噜项目做到了这一点。 我们需要连接的新版本,因为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"
        }
      }
    }
  }
}

故宫应该自动把它捡起来,而这样做的安装项目。

(参见: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )



Answer 2:

对于那些从2018年以后,使用NPM 5.0或以上版本:编辑你的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"部分。



Answer 3:

对于使用这些纱。

我试着用NPM拆封,直到我发现了纱线CLI忽视了我的NPM-shrinkwrap.json文件。

纱线具有https://yarnpkg.com/lang/en/docs/selective-version-resolutions/这一点。 整齐。

看看这个答案过于: https://stackoverflow.com/a/41082766/3051080



Answer 4:

最简单的是最小的仅添加初始shrinkwrapped依赖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"
    }
  }
}


Answer 5:

你也可以考虑以下方法。

假设你的项目对包A的依赖而这又取决于包B.创建这种依赖关系链: your_project -> Package A -> Package B 。 B中包A依赖于你现在要更新的版本,而不是在一个月中存在包的版本中的错误。

将这些步骤

对于一个新的开始,在开始第1步在步骤3自己的项目开始内工作。

  1. 创建一个新的临时项目npm init
  2. 安装程序包A npm i A@version --save
  3. 安装程序包B npm i B@fixed_version --save
  4. 打开package-lock.json文件和复制包B的整个根级依赖
  5. 卸载程序包B npm un B --save
  6. 取出node_modules文件夹和package-lock.json
  7. 安装所有剩余的依赖npm i
  8. 打开package-lock.json文件并粘贴前面复制根级别的依赖性。
  9. 调整程序包A的依赖包B的版本,以固定的版本。
  10. 取出node_modules文件夹。
  11. 安装无副作用npm i --no-save

您现在应该看到在你的项目的根级依赖node_modules与固定版本的文件夹。

:我没有检查这对于存在依赖于包B.因此,多根级依赖情况your_project -> Package A -> Package Byour_project -> Package C -> Package B 。 我怀疑这仍然会工作和套餐C将保持它自己的版本,但我不知道。

为什么做这样的?

使用这些步骤你让故宫做大部分的工作适合你。 举例来说,它也产生了诚信散列包B.

为什么步X?

步骤3:增加了包B的固定版本作为第一度依赖性和调整当前package-lock.json 。 然而,套餐A仍然有破包版本B的,它保持在自己的依赖node_modules文件夹。

步骤5:与步骤3相同,除了充分去除包B的

第6步:这需要做的,因为我们希望程序包B是一个全新安装根级依赖。

步骤7:该安装所有的依赖关系,将恢复为“断”的情况,并创建一个package-lock.json与在根级破碎的版本包B的文件。

步骤10 + 11:这确保了我们模仿一个新的安装。 NPM总是查找package-lock.json文件,如果没有“node_modules”文件夹。 使用--no-save确保了不存在的副作用,诸如改变到package-lock.json文件。



文章来源: How do I override nested NPM dependency versions?
标签: node.js npm