Npm 如何防止在节点\u模块中嵌套节点\u模块

Npm 如何防止在节点\u模块中嵌套节点\u模块,npm,npm-install,node-modules,Npm,Npm Install,Node Modules,我已经创建了自己的npm包,我们称之为XYZ,它在package.json文件中具有@material ui依赖关系 当我在项目A中安装它时,我在XYZ文件夹中有嵌套的节点模块(因此它是A\node\u modules\XYZ\node\u modules\@material ui),但当我在项目B中安装它时,我没有嵌套的节点模块文件夹。项目A和B在其包.json文件中都有相同版本的@material ui 如何强制我的XYZ软件包从A\node\u modules使用@material ui?

我已经创建了自己的npm包,我们称之为XYZ,它在
package.json
文件中具有
@material ui
依赖关系

当我在项目A中安装它时,我在XYZ文件夹中有嵌套的节点模块(因此它是
A\node\u modules\XYZ\node\u modules\@material ui
),但当我在项目B中安装它时,我没有嵌套的节点模块文件夹。项目A和B在其
包.json
文件中都有相同版本的
@material ui


如何强制我的XYZ软件包从
A\node\u modules
使用
@material ui

在node\u modules文件夹中嵌套的文件夹较少,而在node\u modules文件夹中直接包含的文件夹较多,这有其好处,也有版本控制问题

使用正确的npm版本 正确的
纱线
npm
(即:npm v3)不应存在此类结构问题。在可能的情况下,它应该始终扁平化整个结构,如果版本与顶部的版本不兼容,则只有嵌套的节点模块。

检查版本 所以,如果你让它在一个项目上正常工作,而不是在另一个项目上正常工作,这可能是由于版本的原因。检查
@material ui
在这两个界面上的版本是否相同。也许两个不同的包在某一点上相互冲突

检查如何安装它们 从你的问题来看,它说的是同一个版本。但是,您没有提到如何在这两个项目上安装软件包。如果使用
warn-link
npm-link
安装,则应按预期正确安装依赖项

检查您是否使用不同的软件包 如果您查看该软件包,则最近的
材质ui
已被弃用,通知中说要升级到
@material ui/core
。可能是该文件夹中的某些包不相同。无论哪种方式,只要存在依赖冲突,都是这样。检查
@material ui
文件夹内部

手动展平(危险) 有几个方案可以有力地解决这个问题。它们将遍历嵌套的node_模块文件夹,并将其展平到单个文件夹中

展平包裹
  • 使用,
    npm安装-g扁平化软件包安装
  • 运行可执行文件
    plant packages
    ,重新排列项目目录中node_modules文件夹中的所有包
  • 展平将删除包的旧版本。您应该注意与版本中断更改相关的错误

您可以使用
npm duplicate
命令来完成此操作

您可以将该命令放入
postinstall
脚本中的
package.json
,每次NPM安装包时,
NPM duplicate
命令将为您展平同一版本中的所有重复包

有关详细信息,请参阅


我的NPM软件包中的React本机应用程序也有同样的问题。 问题是在项目A中使用的React Native版本(0.59.5)低于我的包中使用的版本(0.59.8)。
在一个全新的项目(B)中安装软件包,当然当时使用的是React Native的最新版本,这与我的软件包(0.59.8)相同。

我对公认的答案还有一个补充:

清除本地节点\u模块文件夹缓存
rm-rf节点模块

小心处理:有时,将项目迁移到新的npm模块可能会在
节点\u模块
文件夹中导致奇怪的缓存问题,尤其是那些已经存在一段时间的问题,或者碰巧在子依赖项中安装了与root中安装的版本不同的较新版本的包

一旦通过package.json dependencies删除了直接依赖项,这些包将从
/node_modules
中删除。这可能会导致一个错误,新模块仍然嵌套在依赖项下,而不是像预期的那样移动到根目录下


因此,通过清除本地节点模块,您可以重新安装一个干净的节点,并让展平开始工作。

感谢您的解释。我将在周一再次检查,并接受是否解决了我的问题。请说明哪些有效,哪些无效,以便我们能够找出发生了什么。:)看起来我有相同版本的@material ui/core,但是@material ui/icons不同,这就是为什么我有嵌套的node_模块。非常感谢。为什么不使用
npm dedupe
(不危险)来展平依赖关系树?这对于一级嵌套依赖关系很有效。对于以下场景,其不起作用--
node_modules/dependency1/node_modules/dependency2/node_modules/dependency_not_被删除
关于如何在此级别删除的任何建议