为什么NPM模块的依赖关系总是可以安装到嵌套的node_modules?

时间:2016-10-09 22:33:31

标签: npm protractor node-modules

如您所知,NPM v3尝试使依赖树尽可能保持平坦。以前我认为它只是嵌套安装依赖项来解决冲突,以防同一个模块有多个版本。

但是,我注意到模块"<div class='field-row clearfix'>" + "<label for='passenger_" + i +"'></label> " + "<input id='passenger_" + i +"' name='passenger_" + i +"' required type='text'> " + "</div>" + 有些奇怪。它具有依赖项protractor,它始终作为嵌套安装到webdriver-manager。您可以通过在空文件夹中运行node_modules/protractor/node_modules来轻松复制此内容。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,目前的行为是预期的。 npmV3确实在平面结构中安装了依赖项,Protractor也以相同的方式安装

使用npmV3

安装量角器时

enter image description here

使用npmV2.*

安装量角器时

enter image description here

所有模块都安装在Flat Structure中,但仍然webdriver-manager仍然是嵌套结构。这是因为存在冲突的依赖关系。

As per official documentation

  

您的依赖项现在将最大程度地安装。就目前而言   可能的,所有依赖项,它们的依赖项,以及它们   依赖项将安装在项目的node_modules文件夹中   没有嵌套。您只会看到彼此嵌套的模块   当两个(或更多)模块具有冲突的依赖关系时。

     

现在,让我们说我们想要另一个模块,C。C需要B,但是   在另一个版本比A.但是,因为B v1.0已经是顶级   dep,我们不能将B v2.0安装为顶级依赖项。 npm v3   通过默认为npm v2行为并嵌套新的来处理这个问题,   不同的,模块B版本依赖于需要的模块   它 - 在这种情况下,模块C。

webdriver-manager package.json列出了依赖项"minimist": "^1.2.0",,这是其他包的冲突要求,例如乐观主义者需要以下依赖列表

  ├─ optimist@0.6.1
   │  ├─ wordwrap@0.0.3
   │  └─ minimist@0.0.10

因此,由于存在冲突的依赖关系,webdriver-manager

中会安装protractor node_modules

为完整的依赖关系树做一个npm-remote-ls protractor并在所有依赖关系中进行冲突