如何防止node_modules文件夹内嵌套其他node_modules文件夹

37

我创建了自己的npm包,我们称之为XYZ,它在其package.json文件中具有@material-ui依赖项。

当我在项目A中安装它时,我在XYZ文件夹内部嵌套了node_modules(因此是A\node_modules\XYZ\node_modules\@material-ui),但是当我在项目B中安装它时,我没有嵌套的node_modules文件夹。 项目A和B的package.json文件中都使用相同的版本@material-ui

如何强制我的XYZ软件包使用来自A\node_modules@material-ui

4个回答

30

减少嵌套文件夹的好处是可读性强,但在node_modules文件夹中增加更多文件夹会导致版本控制问题。

使用正确的npm版本

yarnnpm(即npm v3)不应该有这种结构问题。它应该尽可能平铺整个结构,并且只在版本与顶部不兼容时才嵌套node_modules。

检查版本

如果您在一个项目上可以正常工作,在另一个项目上无法正常工作,那么很可能是由于版本问题。请检查两个项目上的@material-ui是否具有相同的版本号。也许两个不同的包在某些点上产生冲突。

检查安装方式

从您的问题中可以看出,它们是相同的版本。然而,您没有提及如何在两个项目上安装软件包。如果您使用yarn linknpm link进行安装,则应按预期正确安装依赖项。

检查是否正在使用不同的软件包

如果检查软件包,最近已弃用material-ui,通知说要升级到@material-ui/core。这个文件夹中的某些软件包可能不同。无论哪种方式,只要存在某些依赖冲突,就会出现这种情况。请在@material-ui文件夹内进行检查。

手动平铺(危险)

有几个软件包可以强制解决这个问题。它们将遍历嵌套的node_modules文件夹并将其压缩为单个文件夹。

flatten-packages

  • 使用命令 npm install -g flatten-packages 进行安装。
  • 运行可执行文件 flatten-packages,以重新排列项目目录中node_modules文件夹中的所有软件包。
  • Flatten将删除某个软件包的旧版本,您需要注意与版本相关的错误。

谢谢您的解释。我会在周一再仔细检查,如果解决了我的问题,我会接受它。 - Jac Mos
1
请回复哪些部分有效,哪些部分无效,这样我们才能弄清楚发生了什么。 :) - Md. Abu Taher
看起来我有相同版本的@material-ui/core,但是@material-ui/icons不同,这就是为什么我有嵌套的node_modules。谢谢! - Jac Mos
2
为什么不使用 npm dedupe(安全)来展平依赖树呢? - murf

12
你可以使用 npm dedupe 命令来完成这个操作。
你可以将该命令放在 package.json 文件中的 postinstall 脚本中,每次 NPM 安装包时,npm dedupe 命令都会为您平铺所有相同版本的重复包。
要了解更多信息,请参见https://docs.npmjs.com/cli/dedupe npm postinstall script

这适用于一级嵌套依赖项,但对于以下场景不起作用-- node_modules/dependency1/node_moduels/dependency2/node_modules/dependency_not_being_removed。有什么建议可以在这个级别上删除它? - Suchin

1

我有一个对已接受答案的补充:

清除本地 node_modules 文件夹缓存

rm -rf node_modules

小心操作:有时将项目迁移到新的 npm 模块可能会导致 node_modules 文件夹内出现奇怪的缓存问题,特别是那些已经存在一段时间或者在子依赖项中安装了与根目录中安装版本不同的新版本包

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

因此,通过清除本地 node_modules,您可以进行干净的重新安装,并让其执行平铺操作。


0

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


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