7

我的项目依赖于angular2 beta.6,另一个项目依赖于angular2 beta.0。

我的项目的 package.json

"dependencies": {
    "angular2": "2.0.0-beta.6",
    "another-project": "0.0.1"
}

另一个项目的 package.json

"dependencies": {
    "angular2": "2.0.0-beta.0",
}

当我npm install的项目,它安装angular2两次:

  1. node_modules/angular2(beta.6)
  2. node_modules/another-project/angular2(beta.0)

试图了解 npm3 如何决定嵌套 angular2 beta.0。是因为两者都被称为 angular2 ,因此它们不能都坐在顶层吗?

4

3 回答 3

3

试图了解 npm3 如何决定嵌套 angular2 beta.0。是因为两者都被称为 angular2 ,因此它们不能都坐在顶层吗?

是的,这是正确的。节点代码require'一个模块名称,使用如下代码:

require('angular2');

Node 本身不知道不同的版本,这是 的工作npm,所以它只是首先使用 require 路径中匹配的任何模块,依赖于匹配的目录名称。

npm当发生冲突时,通过在每个模块的目录中安装特定版本来适应这一点,因此 require 路径将首先包含该版本。

于 2016-02-14T19:58:29.197 回答
3

是的,这是因为beta.0. 因为npm已经在全局层面找到了另一个版本的angular2,所以会在本地安装。

npm3只有在更高级别上没有其他版本的依赖项时才会安装全局依赖项。

这是我发现的一个小例子:

  • [节点模块]
    • 德普A v1.0
    • DEP B v1.0
      • 德普A v1.0(使用根版本)
    • 开发C v1.0
      • dep A v2.0(这个版本和root版本不同,所以会嵌套安装)
于 2016-02-14T20:04:46.323 回答
1

在 npm v3 中引入了平面依赖。可以在此处找到文档https://docs.npmjs.com/how-npm-works/npm3

从文档中回答您的问题

但是,由于 B v1.0 已经是顶级 dep,我们不能将 B v2.0 安装为顶级依赖项。npm v3 通过默认为 npm v2 行为并将新的、不同的模块 B 版本依赖项嵌套在需要它的模块下(在本例中为模块 C)来处理此问题。

所以顺序很重要。您首先安装的模块将依赖于顶层。后续模块将具有嵌套依赖项。

npm dedupe如果嵌套模块依赖项存在于顶层,您可以运行以删除它们。

于 2017-06-21T23:18:00.983 回答