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

Posted

技术标签:

【中文标题】如何强制 npm 3 安装嵌套依赖项?【英文标题】:how can I force npm 3 to install nested dependencies? 【发布时间】:2016-01-24 02:27:11 【问题描述】:

我刚刚升级到npm version 3,并注意到它所做的最大变化之一是它强制执行flat dependency tree。

您的依赖项现在将安装到最大平面。在可能的情况下,您的所有依赖项及其依赖项以及它们的依赖项都将安装在您项目的 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 A 的依赖项位于其自己的 node_modules 文件夹中,与 npm v2 的做法相同。

【问题讨论】:

【参考方案1】:

你试过--legacy-bundling 换成npm install吗?

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

--legacy-bundling 参数将导致 npm 安装包,以便 1.4 之前的 npm 版本(例如节点 0.8 中包含的版本)可以安装包。这消除了所有自动重复数据删除。

【讨论】:

【参考方案2】:

这就是我睡眠不足时会发生的情况。显而易见的解决方案不知何故让我逃脱了。

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

【讨论】:

我遇到了同样的问题,我希望有一个更好的解决方案,因为使用这个你必须:cd node_modules/A && npm install 然后cd node_modules/A/node_modules/B && npm install 等等......据我了解,所有包都必须遵循 npm 处理依赖项的新方式,然后才能使用 npm 3.0,对吗? @Gabin 据我所知,你是对的。它使升级依赖项成为一场噩梦。【参考方案3】:

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

【讨论】:

我会试试这个,看看它是否有效。另外我相信你的说法“NPM 附带 Node.js”是错误的;相反。 Node 随 npm 一起安装。 是的。我刚刚修好了。谢谢! 谢谢。我认为措辞只是令人困惑。因为当你说“npm 自带node”时,可能意味着npm 自带node 安装,也就是说,当你安装npm 时,你会自动得到node(不正确);或者 npm 与 node 一起安装,即安装 node 会给你一个 npm 的副本(正确)。英语很笨。

以上是关于如何强制 npm 3 安装嵌套依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

强制 npm 在多台机器上安装相同的依赖项

“npm install” 将所有依赖项安装在 node_modules 目录中,而不是嵌套它们

强制依赖使用特定的子依赖版本

如何安装 NPM 拒绝安装的依赖项?

如何使用 npm 重新安装应用程序的依赖项?

如何让 npm 从 GitHub url 安装 typescript 依赖项?