本地 NPM 模块未正确安装

Posted

技术标签:

【中文标题】本地 NPM 模块未正确安装【英文标题】:Local NPM modules not installing correctly 【发布时间】:2016-03-27 13:09:57 【问题描述】:

本地 NPM 模块不再正确安装在我的项目 node_modules 目录中。这才刚刚开始。

我用 package.json 设置了一个 test 目录:


    "name": "test",
    "version": "0.0.0"

然后运行这个命令:

npm install grunt --save-dev

这是我在 node_modules 目录中得到的:

打开 grunt 目录,您可以看到没有 node_modules

出现在根目录中的一些 NPM 模块似乎是属于 grunt NPM 模块的 NPM 模块,而有些我不知道它们来自哪里?例如。 abbrevesprimagraceful-fs

我曾经得到这个:

project
│
└───node_modules
|   │
|   └───grunt
|
└───package.json

我已经尝试按照这些instructions 从我的机器(Mac OS X 10.10.5)中完全删除 Node.js 和 NPM。然后在 Homebrew 之外重新安装它(之前安装它的地方),这并没有改变任何东西。然后再次完全删除 Node.js 和 NPM 并重新安装它 with Homebrew 但这次我应用了this。同样,这并没有解决任何问题。

不确定发生了什么?

【问题讨论】:

【参考方案1】:

这是预期的行为。当你安装 grunt 时,npm 会递归地安装它的所有依赖项。这些可以放在 grunt/node_modules 中,也可以放在与 grunt 相同的级别(直接在*** node_modules 中)。这两个选项都会起作用,这是因为节点的工作方式:如果 grunt 需要一些包(例如,颜色)并且节点在 grunt 的 node_modules 目录中找不到它,节点会尝试在父目录中找到包,然后在祖父母目录等。

在这两个选项中,较旧的 npm 版本更喜欢第一个选项,新版本更喜欢第二个选项(即更扁平的依赖关系树),这正是您的情况。

在您的情况下,诸如“异步”或“颜色”之类的包是 grunt 依赖项(查看其 package.json),“abbrev”不是 grunt 的直接依赖项,但可能是其他一些依赖项的依赖项。

更多阅读:

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

https://github.com/alexanderGugel/ied

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

【讨论】:

好的,谢谢您的解释。我想我不明白这部分:“'abbrev' 不是 grunt 的直接依赖项,但可能是其他一些依赖项的依赖项。” 如果我只有 grunt 那么什么可以使用这些依赖项?这让我感觉很糟糕。 不,它绝对没有损坏 :) grunt 依赖于 'nopt' 包,它依赖于 'abbrev' 包。由于现代 npm 更加面向扁平依赖树,因此您最终将所有这些依赖项放在一个目录中。 OTOH,对于较旧的 npm,您最终会在 ./node_modules/grunt/nopt 中拥有“nopt”,在 ./node_modules/grunt/nopt/node_modules/abbrev 中拥有“abbrev”

以上是关于本地 NPM 模块未正确安装的主要内容,如果未能解决你的问题,请参考以下文章

尝试在本地安装“Prestashop”但未正确安装 INTL

django中的python模块未正确导入

使用 npm 链接符号链接反应模块以进行本地开发会出错

Gulp 错误(未找到模块)

由于 npm 未导航到不正确的目录,无法运行服务器。并找到 package.jason

如何在不使用 npm 的情况下安装 node.js 模块?