npm安装不会安装依赖的依赖项

3
当我使用npm install安装我的Node应用程序时,package.json中的dependencies属性中列出的软件包会被安装。但是,由于某种原因,其中一些依赖项没有安装其子依赖项。换句话说,没有一个包含我的依赖项的依赖项的node_modules文件夹。
myproject
- node_modules
  - my-package
    - node_modules (would expect this to be here, but it's not)

奇怪的是,在另一个项目中,同样的包的子依赖项正在被安装。即使我尝试通过npm install my-package手动安装单个包,该包的node_modules也没有被安装。这是为什么呢?或者有没有一种方法可以调试这个问题?谢谢。

1
较新版本的NPM会扁平化node_modules层次结构,以避免出现极长的文件路径。请检查最上层的node_modules级别以获取子依赖项。 - Jake Holzinger
2个回答

7
NPM试图将您的依赖项扁平化到根级别。如果有一个版本满足所有依赖关系(无论是只有一个包的依赖关系,还是版本满足package.json中定义的所有包要求),它将升级到node_modules的根目录。这样做是故意的,以便您不会多次安装相同的依赖项。
但是,如果存在模块的冲突版本,就会违反此规则,例如package1具有依赖项a版本1.0.1,而package2具有依赖项a版本2。

谢谢Mike。问题是,对于我的特定用例,我希望它不要这样做,因为我需要确保文件路径,因为我需要在一个子依赖项中插入许可证。它可能已经在一个项目中卷起了子依赖项,而在另一个项目中没有这样做,这有点令人担忧。 - Joe
你写了子依赖项吗? - Mike
最后我发现在package-lock.json中有一个未使用、不需要的版本。一旦我把它清除掉,那么子依赖的单个版本就被安装了(位于node_modules的顶层)。 - Joe

2

我之前提出了一个类似的问题,但并没有找到实际解决方案。现在我已经找到了正确的方法,可以让你的包安装自己的node_modules文件夹,只需要在package.json中添加以下内容:

"bundledDependencies": [
    "npm-package"
]

将您想要安装在“my-package”文件夹的“node_modules”中的软件包添加到该数组中:
myproject
- node_modules
  - my-package
    - node_modules <-- This folder will contain the packages of the array

因此,package json 的一个示例可能如下所示:
{
  "name": "my-package",
  "version": "1.0.0",
  "dependencies": {
    "cheerio": "^1.0.0-rc.10",
    "jsdom": "^19.0.0",
    "yargs": "13.2"
  },
  "bundledDependencies": [
    "yargs",
    "jsdom"
  ]
}

当你在其他项目中安装my-package时,它将有自己的node_modules,其中包含在bundledDependencies中指定的软件包。

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