节点包管理器(NPM)似乎会产生重复的软件包。

5

我一直在安装一些node包,注意到NPM会创建很多重复的包。

例如,我首先安装了mongoose,它自然而然地安装了许多依赖项。然后我安装了mongodb包,它也带有bson作为依赖项。由于存在重叠的依赖关系,我出现了以下异常:

mongodb存在于以下目录中:

/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/

此外,MongoDB 的依赖项 bson 在这两者中都存在:
/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/

我知道这些只是几千字节的文件,但我觉得这可能会导致很多冗余,最终可能会得到一个非常复杂的树形结构,类似于以下内容:
/usr/local/lib/node_modules/[something1]/node_modules/[something2]/node_modules/[something3/.../.../node_modules/[somethingX]/

在这种情况下,给定的[依赖项]可能存在于/usr/local/lib/node_modules的X级目录下。
我的主要担忧与更新这些模块有关。我不难想象同时安装不同版本的并发模块。
将所有内容直接放在/usr/local/lib/node_modules/中,然后交叉引用依赖关系是否更容易?
1个回答

3
问题是当mongoose仅编码用于v1的mongodb时,而您的应用程序已经编码为与v2的mongodb配合使用 - 因此,它会安装和加载两个版本以使其全部起作用。我们在node中可以轻松地做到这一点,因为require模块方式不会污染全局命名空间,与浏览器不同 - 这使得管理和包含正确依赖项由于全局命名空间污染而变得非常麻烦。
现在,如果您的package.json和mongoose的package.json允许相同的mongodb版本(您可以指定特定版本或范围),那么执行rm -Rf node_modules; npm install将仅安装一个mongodb副本,而不是两个。但是如前所述,如果指定了多个版本,则将安装和加载多个版本。

安装了许多不同的模块并启动了许多不同的项目后,这是否会创建一个繁忙的层次结构?有没有一种方法可以使用NPM运行递归更新? - zcserei
只要人们编写的是将来有一天会完成的小模块,而不是那些总是在更新的大模块,那么只会安装一个模块副本。因此,在现实中这并不是什么大问题,因为大多数节点模块都很小,如果不是这样,它们会听从 substack(James Halliday - http://substack.net/)一段时间,然后被说服采用小型哲学 :) 一段时间以前,我在这个确切的问题上发表了一些想法:https://gist.github.com/balupton/5308717 或许这会有所帮助,我也花了很长时间才意识到这一点 :) - balupton
1
如果[两者]...允许相同的[]版本...只会安装一个副本。那为什么它没有这样做呢?我有一个特殊情况,只应该使用一个副本,但是安装了几个副本,而且需要很长时间,因为...嗯,我不确定为什么,但每个实例安装需要相当长的时间! - Michael

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