Gradle的依赖关系管理系统将下载的工件存储在本地Maven缓存中。当构建再次请求相同的依赖关系时,只需从缓存中检索依赖关系,从而避免工件的任何网络传输。
我试图用NPM复制这种行为来构建JavaScript项目。我期待NPM支持全局node_modules缓存,但是在全球范围内安装一个软件包"在NPM中有不同的含义=>包被添加到PATH,以便它可以用作CLI工具。
阅读npm install的文档,标准行为是将软件包安装到 local node_modules目录中。但这意味着系统上的许多重复包会浪费宝贵的磁盘空间。这对于进行清洁生产构建也是一个问题,因为理想情况下每次都应该将node_modules吹走。
NPM是否支持像Gradle的Maven缓存? NPM cache上的文档并没有更清楚地说明如何使用它。而且,如果使用NPM的缓存策略在多个并行构建中是安全的,那么这一点并不明显。
这似乎是忙碌的CI环境的基本要求,它必须先解决。我找到了似乎提供此支持的npm-cache工具,但如果npm
本身支持缓存会更好。
谢谢!
答案 0 :(得分:1)
NPM缓存已经comes bundled with NPM out of the box(列在 cli命令下)。它的主要用途是避免一遍又一遍地对同一个包进行网络传输。
关于重复包问题,从npm v3开始,已经有an effort in terms of finding ways to deduplicate dependencies。但它仍然不能像Gradle一样工作,因为它仍然可能最终在#include <GLFW/glfw3.h>
文件夹中包含相同包的重复项。
您的
node_modules
目录结构,因此您的依赖关系树依赖于安装顺序
虽然来自同一个包json的新node_modules
总是生成相同的依赖树:
npm install命令在专门用于从apackage.json安装软件包时,将始终生成相同的树。这是因为package.json中的安装顺序始终是按字母顺序排列的。相同的安装顺序意味着您将获得相同的树。
所以至少有一种方法可以获得一致的依赖树,尽管不能保证它是最有效的依赖树。至少是那些差异do not interfere correct functioning of NPM.
希望有所帮助。
答案 1 :(得分:-1)
恕我直言,遗憾的是,制造商并未从已经存在的maven等事物中学到东西。如果您正在使用微服务并且在您的计算机上拥有许多应用程序,并且您可能还有多个分支机构或本地jenkins,那么您将在磁盘上具有N * M次的每个依赖性,这是对磁盘空间和性能的极大浪费。因此,您必须意识到Java或.NET / C#是成熟的生态系统,而JavaScript生态系统仍处于童年时代,存在许多缺陷和优势。但是JavaScript正在快速发展,所以让我们充满希望。随意与npm制造商讨论您的痛苦(https://github.com/npm/npm/issues/)。
然而,如果你离开npm并切换到纱线,会有部分治愈:http://yarnpkg.com/