npm正在以奇怪的递归方式安装依赖项。

8
我使用npm install --dev命令安装了package.json文件中列出的依赖项。看起来它并没有将所有软件包都安装在一个平面结构中,而是将每个模块的依赖项安装在模块目录内。
我不得不取消这个操作,因为它花费了很长时间,因为许多依赖项应该已经被满足,但它必须在不同的嵌套目录中重新下载它们(我希望没有循环依赖,否则它最终会完成)...
使用tree命令可以看到以下示例:
├── grunt-cli
│   └── node_modules
│       ├── findup-sync
│       │   └── node_modules
│       │       ├── glob
│       │       │   └── node_modules
│       │       │       ├── minimatch
│       │       │       │   └── node_modules
│       │       │       │       ├── lru-cache
│       │       │       │       │   └── node_modules
│       │       │       │       │       └── weak
│       │       │       │       │           └── node_modules
│       │       │       │       │               └── mocha
│       │       │       │       │                   └── node_modules
│       │       │       │       │                       ├── coffee-script
│       │       │       │       │                       │   └── node_modules
│       │       │       │       │                       │       └── jison
│       │       │       │       │                       │           └── node_modules
│       │       │       │       │                       │               └── browserify
│       │       │       │       │                       │                   └── node_modules
│       │       │       │       │                       │                       ├── browser-resolve
│       │       │       │       │                       │                       │   └── example

你有什么想法,为什么会发生这种情况?

2个回答

14

不用担心,这其实是Npm的设计理念。你甚至可能会看到同一个模块被安装多次(尽管通常具有不同的版本)。

这个想法是每个在node_modules下安装的模块都是一个相对独立的安装,包括它的依赖和必要的版本 - 不依赖于全局安装的模块。

如果你担心模块被重复安装导致效率低下,可以使用实验性的npm dedupe命令。


2
但是为什么呢?当在网上搜索时,我很难找到一个有效的论据来支持这种方法。全局安装或使用扁平结构有什么问题吗?这实际上解决了什么问题?似乎你可以将所有东西都安装在一个扁平的结构中,并在目录名称中包含版本以避免冲突。当前的实现似乎非常低效。 - Danny
2
请看一下这篇文章,Danny:http://dontkry.com/posts/code/modules-the-right-way.html - jackyalcine
1
感谢@jackyalcine提供的链接。我对NPM感到非常沮丧。但是那篇文章解决了我的所有问题,并为我提供了一些管理目录深度问题的好工具。(是的,我在使用windows系统,可悲啊)。 - John Henckel
很高兴能帮到你,@JohnHenckel! - jackyalcine

2

正如Jonathan Warden所说,dedupe非常有用。不过,尝试npm3吧。对于像gulp-jscs这样的简单包,使用npm3安装可以减少20%的文件,减少5%的磁盘空间。而且树深度从22变成了5。但是,对我来说,npm3的速度慢了2倍。


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