NPM 缓存类似于本地 Maven 缓存

Boo*_*oon 6 caching dependency-management gradle maven npm

Gradle 的依赖管理系统将下载的工件存储在本地 Maven 缓存中。当构建再次请求相同的依赖项时,该依赖项只是从缓存中检索,避免了工件的任何网络传输。

我正在尝试使用 NPM 复制此行为以构建 JavaScript 项目。我期待 NPM 支持全局 node_modules 缓存,但是在 NPM 中“全局”安装包有不同的含义 => 包被添加到 PATH 以便它可以用作 CLI 工具。

阅读npm install的文档,标准行为是将包安装到本地node_modules 目录中。但这意味着系统上有许多重复的软件包会浪费宝贵的磁盘空间。这也给进行干净的生产构建带来了问题,因为理想情况下每次都应该将 node_modules 吹走。

NPM 是否支持 Gradle 的 Maven 缓存之类的东西?关于NPM 缓存的文档并没有更清楚地说明如何使用它。更重要的是,使用 NPM 的缓存策略在多个并行构建中是否安全并不明显。

对于繁忙的 CI 环境来说,这似乎是一个基本要求,以前肯定已经解决了。我找到了npm-cache工具,它似乎提供了这种支持,但如果缓存npm本身就被支持会更好。

谢谢!

Jör*_*örg 5

恕我直言,遗憾的是制作者没有学习像 Maven 这样已经存在的东西。如果你正在做微服务并且机器上有许多应用程序,并且你可能还有多个分支或本地 jenkins,那么你将在磁盘上拥有每个依赖项 N*M 次,这对磁盘空间和性能来说是极大的浪费。所以你必须意识到,Java 或 .NET/C# 是成熟的生态系统,而 JavaScript 生态系统仍处于幼年期,有很多缺陷和边缘。但 JavaScript 正在快速发展,所以让我们期待最好的结果。请随意与 npm 开发者讨论您的痛苦(https://github.com/npm/npm/issues/)。

然而,如果您放弃 npm 并改用纱线,就会得到部分解决:http://yarnpkg.com/


fme*_*llo 2

NPM 缓存已经与开箱即用的 NPM 捆绑在一起(在cli 命令下列出))。它的主要用途是避免同一包的网络传输。

\n\n

关于重复包问题,从 npm v3 开始,人们一直在努力寻找消除重复依赖项的方法。但它仍然不能像 Gradle 一样工作,因为仍然有可能在文件夹中出现相同包的重复项node_modules

\n\n

根据NPM 文档

\n\n
\n

您的node_modules目录结构以及依赖关系树取决于安装顺序

\n
\n\n

尽管来自同一个包的新npm installjson 总是会生成相同的依赖关系树:

\n\n
\n

当专门用于从 apackage.json 安装软件包时,\xc2\xa0npm install\xc2\xa0 命令将\xc2\xa0 始终生成相同的树。这是因为安装顺序为 a\xc2\xa0package.json\xc2\xa0is\xc2\xa0always\xc2\xa0alphabetical。相同的安装顺序意味着您将获得相同的树。

\n
\n\n

因此,至少有一种方法可以获得一致的依赖树,尽管不能保证它是最有效的。至少这些差异不会干扰 NPM 的正确运行。

\n\n

希望有帮助。

\n