如何防止在node_modules中嵌套node_modules

时间:2018-08-10 12:38:14

标签: npm npm-install node-modules

我已经创建了自己的npm包,我们将其称为XYZ,它在IdPartenaire文件中具有Extent2依赖性。

当我将其安装在项目A中时,我在XYZ文件夹中嵌套了node_modules(因此为IdPartenaire),但是当我将其安装在项目B中时,则没有嵌套的node_modules文件夹。项目A和项目B的Extent3文件中的NomPrestation具有相同的版本。

如何强制我的XYZ软件包使用Extent3中的NomPrestation

4 个答案:

答案 0 :(得分:7)

直接在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将删除软件包的旧版本。您应注意与版本变更相关的错误。

答案 1 :(得分:0)

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

您可以将命令放在postinstall的{​​{1}}脚本中,每次NPM安装软件包时,package.json命令都会为您拼合相同版本的所有重复软件包。

有关更多信息,请参见https://docs.npmjs.com/cli/dedupe

npm postinstall script

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了已接受的答案外,我还有另一个补充:

清除本地node_modules文件夹缓存

rm -rf node_modules

小心处理:有时,将项目迁移到新的npm模块可能会在node_modules文件夹内引起奇怪的缓存问题,尤其是已经存在一段时间或碰巧发生了<子依赖性中安装的strong>较新版本的软件包,与根目录中的已安装版本不同。

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

因此,通过清除本地的node_modules ,您可以进行全新安装,并使其扁平化。