据我所知npm
通过允许每个模块将所有内容都作为树来解决模块依赖性。这意味着如果module1
使用dependency1-v1.0
,而module2
也使用相同的依赖关系,那么他们都会下载它,因此我们有这样的文件结构:
/node_modules
/module1
/node_modules
/dependency1-v1.0
/dependency2-v0.9
/module2
/node_modules
/dependency1-v1.0
/dependency2-v0.9
/module3
/node_modules
/dependency1-v1.2
/dependency2-v0.9
是否存在一个足够聪明的节点包管理器来实现这一点并管理公共集合中的依赖关系,这可能看起来像这样?
/packages
/module1
/module2
/module3
/dependencies
/dependency1
/v1.0
/v1.2
/dependency2
/v0.9
如果它可以执行垃圾收集并删除未引用/未使用的依赖项,最好是自动执行(例如npm rm
)。
我经常看到的另一件事是模块有测试和dev依赖,只有在想要确定模块是否按预期运行时才有用,但我认为这通常会浪费空间,时间和带宽。
我错过了什么吗?有没有办法安装节点模块而不必拥有所有这些膨胀?
是的,我知道在模块中,人们可能会做这样的事情来加载依赖:
var dep1 = require('dependency1');
而不是在此处指定其版本,该版本在package.json
中定义。但是,我仍然认为应该可以将所有内容下载到模块自己的node_modules目录中,而不是使用符号链接或简单的" facade"加载程序文件将由"更聪明的npm"。
答案 0 :(得分:4)
来自FAQ:
为什么不能将npm放在一个地方,就像其他包一样 管理者吗
并非每项改变都是改进,但每项改进都是改变。 这就像要求git为每次提交做网络IO。它的 不会发生,因为这是一个可怕的想法导致更多 比它解决的问题。
在没有嵌套的情况下避免依赖冲突要困难得多 依赖。这是npm工作方式的基础,并且具有 事实证明这是一种非常成功的方法。请参阅npm-folders(5) 更多细节。
如果您希望将软件包安装在一个位置,并拥有所有软件包 程序引用它的相同副本,然后使用npm link命令。 这就是它的用途。全局安装,然后将其链接到每个 使用它的程序。
无论如何,我真的希望旧式“全球化”。
编写自己的包管理器。你甚至可以把npm包起来 如果你真的想要一个shell脚本。
npm不会帮助你做一些已知不好的事情。
即使在所有这些之后你仍然想要这个功能,转到npm git并提交一个功能请求,SO不是npm功能请求的地方。
Though, it seems we may be seeing some improvements to this in npm@3:
您的依赖项现在将最大程度地安装。在可能的情况下,所有依赖项及其依赖项和它们的依赖项都将安装在项目的node_modules文件夹中,而不进行嵌套。当两个(或更多)模块具有冲突的依赖关系时,您将只看到彼此嵌套的模块。