【问题标题】:How does npm3 decides to install flat vs. nested?npm3 如何决定安装平面与嵌套?
【发布时间】:2016-02-14 19:41:06
【问题描述】:

我的项目依赖于 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,因此它们不能都坐在顶层?

【问题讨论】:

    标签: npm npm-install


    【解决方案1】:

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

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

    require('angular2');
    

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

    npm 通过在发生冲突时在每个模块的目录中安装特定版本来解决此问题,以便要求路径首先包含该版本。

    【讨论】:

      【解决方案2】:

      是的,这是因为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(这个版本和root版本不同,所以会嵌套安装)

      【讨论】:

        【解决方案3】:

        在 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 来删除它们。

        【讨论】:

        • 我认为是dedupe,而不是dedup
        猜你喜欢
        • 2016-03-11
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2013-01-27
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        相关资源
        最近更新 更多