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

Posted

技术标签:

【中文标题】使用 NPM 安装包时,你能告诉它使用其依赖项之一的不同版本吗?【英文标题】:When installing a package with NPM, can you tell it to use a different version of one of its dependencies? 【发布时间】:2012-06-29 07:03:06 【问题描述】:

假设您要安装一个库lib-a,它具有依赖关系dep-1dep-2。如果 lib-a 在其 package.json 中声明使用已过期的 dep-2 版本(假设它不适用于刚刚发布的节点 0.8.0),但有一个 @987654326 的分支@ 适用于节点 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

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

使用 NPM,您可以像这样安装项目的特定分支:

npm install git://github.com/user-c/dep-2#node0.8.0

如果我要自定义 lib-a 的 package.json,你可以告诉它像这样使用 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"
  

通过修改 package.json 就可以运行

npm install lib-a

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

那么问题来了,有没有办法告诉 NPM 安装lib-a,并告诉它使用dep-2node0.8.0 分支?像这样的:

npm install lib-a --overrides dep-2:git://github.com/user-c/dep-2#node0.8.0

那太棒了。如果这是不可能的,那会很高兴知道这样我就可以准备好分叉/自定义项目链。

【问题讨论】:

【参考方案1】:

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)

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

安装特定版本的最简单方法是这种情况:

npm install module@0.0.2

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

【讨论】:

看起来如果您先安装依赖项,那么需要该依赖项的其他库将不会下载自己的。这样就解决了问题!谢谢! 正确吗?我尝试了 npm -g install /path/to/my/fork-with-fix 然后 npm -g install package-which-should-use-forked-dependency-with-fix 并且......它仍然下载官方版本。 看看npm link 是的,这个答案真的不能回答我所理解的问题。 Lance Pollard 上面的评论似乎是答案,但我不确定在什么情况下我应该能够指望这种行为。参考文献***.com/questions/15806152/… 讨论 npm shrinkwrap 作为另一种潜在的解决方案 看起来@LancePollard 在他的评论中发现的行为是由npmjs.org/doc/cli/npm-install.html#ALGORITHM 记录的——如果已经安装了一个替代(但仍然“令人满意”)依赖项,那么幸运的是,越野车不会作为子模块安装。

以上是关于使用 NPM 安装包时,你能告诉它使用其依赖项之一的不同版本吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“npm install”告诉我“没有安装你必须自己安装对等依赖项:”?

npm 如何通过 package.json 安装依赖最新版

添加nuget包时不会自动安装依赖项

如何强制 npm 3 安装嵌套依赖项?

几种npm install 的区别

发布 TypeScript 包时如何处理可选的对等依赖项?