npm3如何决定安装flat与嵌套?

时间:2016-02-14 19:41:06

标签: npm npm-install

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

我的项目的package.json

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

package.json for another-project

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

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

  1. node_modules/angular2(beta.6)
  2. node_modules/another-project/angular2(beta.0)
  3. 试图了解npm3如何决定嵌套angular2 beta.0。是因为两者都被称为angular2,因此他们不能都坐在顶层?

3 个答案:

答案 0 :(得分:3)

  

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

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

require('angular2');

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

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

答案 1 :(得分:2)

是的,这是因为beta.0。因为npm在全局级别上找到了另一个版本的angular2,所以它将在本地安装。

只有在更高级别上没有其他版本的依赖项时,

npm3才会安装全局依赖项。

以下是我发现的一个小例子:

  • [node_modules]
    • dep A v1.0
    • dep B v1.0
      • dep A v1.0 (使用root版本)
    • dep C v1.0
      • dep A v2.0(此版本与根版本不同,因此它将是嵌套安装)

答案 2 :(得分:1)

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

从文档中回答您的问题

  

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

顺序很重要。您首先安装的模块将获得它在顶层的依赖性。后续模块将具有嵌套依赖项。

如果它们存在于顶层,您可以运行<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form class="cform"> <input type="text" name="cname" class="cname" id="cname" autofocus placeholder="Firstname Lastname"> <div class="floatl regards"><input type="button" value="Submit" class="submit" id="submit"> </div> </form>来删除嵌套模块依赖项。