如何强制npm 3安装嵌套依赖项?

19

我刚刚升级到 npm 3 版本,发现它最重要的变化之一是强制使用扁平化依赖树

现在将最大程度地扁平化安装您的依赖项。只要可能,所有依赖项及其依赖项和它们的依赖项都将安装在项目的 node_modules 文件夹中,没有嵌套。只有当两个(或多个)模块具有冲突的依赖项时,您才会看到模块彼此嵌套。

例如,如果包 A 依赖于包 B,当您运行 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/

如果我不想一直催促开发人员修复代码并等待 A 的更新,我想知道是否有一种方法可以设置选项,强制 npm 在其自己的 node_modules 文件夹内安装 A 的依赖项,就像 npm v2 一样。

3个回答

24

你尝试过使用--legacy-bundling参数进行npm install吗?

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

--legacy-bundling参数将使npm安装软件包的方式,以便npm 1.4之前的版本(例如与node 0.8一起提供的版本)可以安装软件包。这将消除所有自动去重。


3

当我睡眠不足时,就会发生这种情况。显而易见的解决方案却不知为何逃脱了我的注意。

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

1
我遇到了同样的问题,希望有更好的解决方案,因为如果采用这个方法,你必须依次运行以下命令:cd node_modules/A && npm install,然后再运行cd node_modules/A/node_modules/B && npm install,以此类推......根据我的理解,在npm 3.0版本中,所有的包都必须遵循新的依赖管理方式才能使用,是吗? - Gabin
据我所知,@Gabin是正确的。这会让升级依赖项成为一场噩梦。 - chharvey

0

我刚遇到了这个问题,并找到了一个解决方案。由于Node.js附带了NPM,我能想到的唯一方法是将Node.js降级到0.10版本,该版本附带了旧版本的NPM,可以以旧有的方式安装依赖项。为了降级,我使用 NVM 并运行 nvm use 0.10.0。你可以通过遵循这个技巧在不同的npm版本之间进行切换。希望能有所帮助!


我会尝试这个,看看它是否有效。另外我相信你的说法“NPM随Node.js一起安装”是错误的; 应该是反过来,Node.js自带npm。 - chharvey
是的,我刚刚修好了。谢谢! - Diego
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - chharvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接