2015-10-24 121 views
16

我刚刚升级到npm version 3,并注意到它所做的最大改变之一是它强制执行flat dependency tree如何强制npm 3安装嵌套的依赖关系?

现在,您的依赖关系将被最大限度地平放。只要有可能,您的所有依赖项及其依赖项和他们的依赖项都将安装在您的项目的node_modules文件夹中,且不会嵌套。当两个(或更多)模块具有冲突的依赖关系时,您只会看到嵌套在另一个下面的模块。

因此,举例来说,如果包一个依赖于包,当你npm install A你会得到这个文件的结构:

--- root/ 
|--- node_modules/ 
    |--- A/ 
    |--- B/ 

,而不是旧的文件结构从版本2或更低:

--- root/ 
|--- node_modules/ 
    |--- A/ 
    |--- node_modules/ 
     |--- B/ 

我遇到的第一个问题(我肯定不是最后一个问题)是:

程序包A不知道npm v3的行为并依赖于程序包B。但A采用旧的(v2)文件结构,因为它的代码中有node_modules/B,而不是正确的../node_modules/B。现在从A的代码将不会编译,因为它正在寻找B/在错误的目录中。

如果我不喜欢唠叨开发人员修复代码并等待一个的更新,我不知道是否有一种方法,我可以设置一个选项,这将迫使NPM安装一个的它自己的node_modules文件夹内的依赖关系,npm v2也会这样做。

回答

20

你试过--legacy-bundlingnpm install

https://docs.npmjs.com/cli/install

的--legacy捆扎参数将导致NPM安装包,使得之前1.4 NPM的版本,例如一个包含节点0.8,可以安装软件包。这消除了所有自动重复数据删除。

1

这是我没有得到足够的睡眠时发生的情况。不知何故,这个明显的解决方案逃脱了我

$ cd node_modules/A/ 
$ npm install 
$ cd ../../ 
+1

我遇到同样的问题,我希望有,因为这一个你必须去一个更好的解决方案:'CD node_modules/A && NPM install'然后'CD node_modules/A/node_modules/B && NPM安装“等......从我所了解的情况来看,所有的包必须遵循新的npm句柄依赖关系,才能使用npm 3.0,对吧? – Gabin

+0

@加宾据我所知,你是对的。它使升级依赖成为一场噩梦。 – chharvey

0

我刚刚遇到此问题,并找到了解决此问题的替代方法。由于Node.js带有NPM,我能想到的唯一方法是降级到Node.js 0.10版本,该版本随NPM上的旧版本一起提供,该版本将以旧时尚方式安装依赖项。降级我使用NVM并运行nvm use 0.10.0。按照这个技巧,你可以在npm版本之间来回切换。希望能帮助到你!

+0

我会试试看看它是否有效。我也相信你的陈述“NPM附带Node.js”是错误的;这是相反的方式。节点安装了npm。 – chharvey

+0

是的。我只是修复它。谢谢! – Diego

+0

谢谢。我认为措辞只是令人困惑。因为当你说“npm带有节点”时,这可能意味着* npm随节点*一起安装,也就是说,当你安装npm时,你会自动获得节点(不正确);或者* npm随节点*一起安装,即安装节点会给你一个npm(正确)的副本。英语很愚蠢。 – chharvey