使用NPM安装软件包时,您能告诉它使用其依赖项之一的不同版本吗?

Lan*_*ard 61 dependencies node.js npm

假设你要安装的库lib-a具有依赖性dep-1dep-2.如果lib-a已在其package.json中声明使用的dep-2那个版本已过期(假设它在刚刚出现的节点0.8.0上不起作用),但有一个分支dep-2适用于节点0.8.0 -分支名称node0.8.0.

所以等式中的包是:

git://github.com/user-a/lib-a
git://github.com/user-b/dep-1
git://github.com/user-c/dep-2
git://github.com/user-c/dep-2#node0.8.0
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉NPM安装lib-a,但使用dep-2#node0.8.0而不是dep-2

使用NPM,您可以安装项目的特定分支,如下所示:

npm install git://github.com/user-c/dep-2#node0.8.0
Run Code Online (Sandbox Code Playgroud)

如果我要自定义package.json lib-a,你可以告诉它使用dep-2#node0.8.0这样:

{
  "name": "lib-a",
  "dependencies": {
    "dep-1": ">= 1.5.0",
    "dep-2": "git://github.com/user-c/dep-2#node0.8.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

通过修改package.json,您可以运行

npm install lib-a
Run Code Online (Sandbox Code Playgroud)

它将安装节点0.8.0兼容dep-2分支.但是,这需要我有权修改lib-a,对于我的具体情况,我没有.从技术上讲,我可以fork lib-a并对package.json进行上述更改.但在我的具体情况下,lib-a另一个库的依赖,所以我必须分叉它引用的项目,然后......

所以问题是,有没有办法告诉NPM安装lib-a,并告诉它使用node0.8.0分支dep-2?像这样的东西:

npm install lib-a --overrides dep-2:git://github.com/user-c/dep-2#node0.8.0
Run Code Online (Sandbox Code Playgroud)

那将是真棒.如果这是不可能的,那将是很好的知道,所以我可以准备自己必须分叉/定制项目链.

mic*_*nic 46

NPM安装语法:

npm install (with no args in a package dir)
npm install <tarball file>
npm install <tarball url>
npm install <folder>
npm install [@<scope>/]<name> [--save|--save-dev|--save-optional] [--save-exact]
npm install [@<scope>/]<name>@<tag>
npm install [@<scope>/]<name>@<version>
npm install [@<scope>/]<name>@<version range>
npm i (with any of the previous argument usage)
Run Code Online (Sandbox Code Playgroud)

因此,您可以选择其中一种方法来安装模块.

安装特定版本的最简单方法是这样的:

npm install module@0.0.2
Run Code Online (Sandbox Code Playgroud)

更多信息:https: //docs.npmjs.com/cli/install

  • 是的,这个答案真的没有回答我完全理解的问题.兰斯波拉德上面的评论似乎是答案,但我不确定在什么情况下我应该能够指望这种行为.cf http://stackoverflow.com/questions/15806152/how-do-i-override-nested-npm-dependency-versions讨论了`npm shrinkwrap`作为另一种可能的解决方案 (13认同)
  • 看起来如果首先安装依赖项,那么需要该依赖项的其他库将不会下载它们自己的.这解决了问题!谢谢! (8认同)
  • 那是对的吗?我试过npm -g install / path / to / my / fork-with-fix,然后npm -g install-package-should-use-forked-fork-dependency-with-fix,并且它仍然下载正式版本。 (2认同)
  • 看起来@ LancePollard在他的评论中发现的行为是由https://npmjs.org/doc/cli/npm-install.html#ALGORITHM记录的 - 如果已经安装了备用(但仍然"令人满意")依赖性"这棵树"就像它一样,那么那辆越野车将毫不犹豫地作为子子模块安装. (2认同)