【问题标题】:NPM caching similar to a local Maven cacheNPM 缓存类似于本地 Maven 缓存
【发布时间】:2017-02-09 20:26:18
【问题描述】:

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 本身本身支持缓存会更好。

谢谢!

【问题讨论】:

    标签: maven caching gradle npm dependency-management


    【解决方案1】:

    NPM 缓存已经 comes bundled with NPM out of the box(列在 cli 命令下)。并且它的主要用途是避免同一个包的网络传输一遍又一遍。

    关于重复包的问题,​​从 npm v3 开始就有an effort in terms of finding ways to deduplicate dependencies。但它仍然不能完全像 Gradle 那样工作,因为在您的 node_modules 文件夹中仍然可能出现相同包的重复项。

    NPM documentation

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

    虽然来自同一个包 json 的新 npm install 总是产生相同的依赖树:

    当专门用于从 apackage.json 安装包时,npm install 命令将始终生成相同的树。这是因为 package.json 中的安装顺序始终是字母顺序。相同的安装顺序意味着您将获得相同的树。

    所以至少有一种方法可以获得一致的依赖树,尽管不能保证它会是最有效的。至少这些差异do not interfere correct functioning of NPM.

    希望对您有所帮助。

    【讨论】:

    • 这正是我想要理解的缓存的行为。例如,在我的机器上进行全新安装会创建一个约 3 GB 的 node_modules 目录,但 .npm 缓存目录只有约 120 MB。那么这里发生了什么? npm 不缓存所有内容吗?我在任何地方都找不到这种行为的记录或解释
    • 虽然 NPM 尝试对依赖项进行重复数据删除,但它并不能保证完全重复数据删除。因此,由于其递归性质,您最终可能会在依赖关系树中获得相同包的更多副本。因此,最终会得到一个比缓存文件夹更大的 node_modules 文件夹。
    • 话虽如此,我同意 120MB 到 3GB 的跳跃确实看起来很大。您能否确认您的 npm 版本是否为 3+?我周末离开我的开发环境。但是,如果您发布 package.json 的示例,我很乐意为您运行示例安装并比较结果
    • 啊...我在 2.x 行。我需要 3.x 来进行缓存吗?
    • 对于缓存,没有。但我对于自动重复数据删除,是的。您可以尝试运行 `npm dedupe` 或升级到 v3
    【解决方案2】:

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

    但是,如果您离开 npm 并改用 yarn,则可以部分治愈:http://yarnpkg.com/

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2020-03-06
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多