本地 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 模块,而有些我不知道它们来自哪里?例如。 abbrev、esprima、graceful-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