npm3是如何决定安装平面还是嵌套的?

npm3是如何决定安装平面还是嵌套的?,npm,npm-install,Npm,Npm Install,我的项目依赖于angular2 beta.6和另一个依赖于angular2 beta.0的项目 我的项目的package.json "dependencies": { "angular2": "2.0.0-beta.6", "another-project": "0.0.1" } "dependencies": { "angular2": "2.0.0-beta.0", } 另一个项目的package.json "dependencies": { "angul

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

我的项目的package.json

"dependencies": {
    "angular2": "2.0.0-beta.6",
    "another-project": "0.0.1"
}
"dependencies": {
    "angular2": "2.0.0-beta.0",
}
另一个项目的package.json

"dependencies": {
    "angular2": "2.0.0-beta.6",
    "another-project": "0.0.1"
}
"dependencies": {
    "angular2": "2.0.0-beta.0",
}
当我
npm安装我的项目时,它会安装
angular2
两次:

  • 节点模块/angular2
    (beta.6)
  • node\u模块/另一个项目/angular2
    (beta.0)
  • 试图了解npm3如何决定嵌套angular2 beta.0。是否因为两者都被称为angular2,因此它们不能同时坐在顶层

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

    是的,这是正确的。节点代码
    需要
    按名称显示模块,使用如下代码:

    require('angular2');
    
    节点本身不知道不同的版本,这是npm的工作,所以它只使用在require路径中首先匹配的模块,依赖于匹配的目录名


    npm
    通过在发生冲突时在每个模块的目录中安装特定版本来满足这一要求,因此需要的路径将包括第一个版本。

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

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

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

    • [节点单元模块]
      • dep A v1.0
      • dep B v1.0
        • dep A v1.0(使用根版本)
      • dep C v1.0
        • dep A v2.0(此版本与根版本不同,因此它将是嵌套安装)

    在npm v3中引入了平面依赖关系。文档可以在这里找到

    从文档中回答您的问题

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

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


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

    我认为这是
    dedupe
    ,而不是
    dedup