2015-12-21 162 views
0

本地NPM模块不再为我正确安装在我的项目中node_modules dir。这刚刚开始发生。本地NPM模块未正确安装

我成立了一个测试目录与的package.json

{ 
    "name": "test", 
    "version": "0.0.0" 
} 

然后运行这个命令:

npm install grunt --save-dev 

这是我在node_modules得到目录:

enter image description here

打开咕噜目录,你可以看到有没有node_modules

enter image description here

一些出现在根的NPM模块都似乎是属于咕噜NPM模块 NPM模块,有些我不知道他们来自哪里?例如。 缩写esprima优美-FS

我曾经得到这样的:

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

我已经试过完全从我的机器中取出的Node.js和NPM(的Mac OS X 10.10.5)遵循这些instructions。然后将其重新安装在Homebrew(以前安装的位置)之外,这并没有改变任何东西。然后再次完全删除Node.js和NPM并重新安装它 Homebrew,但这次我申请了this。这再次没有解决任何问题。

不确定发生了什么事?

回答

1

这是预期的行为。当你安装grunt时,npm递归地安装它的所有依赖关系。这些可能会被放到grunt/node_modules中,或者可能放在与grunt相同的级别上(直接在顶层node_modules中)。这两个选项都可以工作,这是因为节点的工作原理:如果grunt需要某些包(例如颜色),并且节点在grunt的node_modules目录中找不到它,节点会尝试在父目录的目录中找到该包,然后在祖父母目录等。

在这两个选项中,较老的npm版本更喜欢第一个选项,较新的版本更喜欢第二个选项(即更平坦的依赖关系树),这正是您的情况。在你的情况下,'async'或'colors'等软件包是grunt依赖项(检查它的package.json),'abbrev'不是grunt的直接依赖项,但可能它是其他依赖项的依赖项。

更多阅读:

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

https://github.com/alexanderGugel/ied

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

+0

OK感谢您的解释。我想我不明白这个部分:_“'abbrev'不是grunt的直接依赖,但可能它是一些其他依赖的依赖。”_如果我只有** grunt **,那么可以使用这些依赖呢?这只是让我感觉破了。 – crite

+0

不,它肯定没有坏:)咕噜依赖'nopt'包依赖'abbrev'包。由于现代npm更加依赖于平面依赖树,所以你最终将所有这些依赖关系放在一个目录中。 OTOH,如果使用较旧的npm,您最终会在./node_modules/grunt/nopt中找到'nopt',并在./node_modules/grunt/nopt/node_modules/abbrev中找到'abbrev' –