【问题标题】:Is there a way to speedup npm ci using cache?有没有办法使用缓存加速 npm ci?
【发布时间】:2019-08-09 08:50:11
【问题描述】:

目前npm ci 是使用 CI 安装节点模块的最常见方式。 但老实说真的很慢。 有没有办法使用缓存加速npm ci 或不完全删除现有包(整个 node_modules 文件夹)?

【问题讨论】:

  • 这里有一些有趣的基准测试可以帮助link。此外,npm ci 的行为方式应该删除 node_modules 文件夹,即使它存在于确定性构建中。

标签: node.js caching npm continuous-integration


【解决方案1】:

NPM 缓存位于 ~/.npm,但在大多数 CI 中,您只能将内容缓存在工作目录中。

您可以通过npm set cache .npm 将缓存目录更改为当前目录来规避此问题。 NPM 缓存现在将位于 ./.npm 中,您可以在 CI 作业之间缓存此文件夹。

GitLab CI 示例:

my-super-job:
  image: node:13-alpine
  script:
    - npm set cache .npm
    - npm ci 
  cache:
    paths:
      - .npm

编辑:刚刚发现你可以set the config as a command line flag 所以npm ci --cache .npm 也应该这样做

【讨论】:

    【解决方案2】:

    tl;dr ̶N̶o̶.̶ 一点点。

    npm ci 在 CI 中应该是首选,因为它尊重 package-lock.json 文件。与 npm install 不同,后者会重写文件并始终安装新版本。

    By design 这个命令总是通过删除开头的node_modules 目录来清除所有本地包。这是长时间构建的主要原因。而且没有办法避免这种恼人的行为。

    在本地计算机上,您可以通过添加选项 --prefer-offline 来加速 npm ci,这会告诉 NPM 忽略缓存最短时间并立即使用本地缓存的包,而不是根据注册表验证它们。

    但是,NPM cache 在 Unix 上位于 ~/.npm,在 Windows 上位于 %AppData%/npm-cache。默认情况下,这些文件夹在大多数 CI 中是不可缓存的。例如 GitLab CI 缓存只有the repository as available workspace。其他目录,如主目录或系统目录(例如apt)不会被缓存。因此,此设置可能不会影响您的 CI 构建时间。

    在旧版本的 NPM 中,选项 --progress=false 通过删除进度条对构建时间产生了显着影响。这个问题似乎已经消失了,但是我无法再衡量一个值得注意的差异。

    separate packages into production and development 是一个最佳实践并且绝对是速度上的提升。通过传递--only=production 选项,NPM 将忽略开发依赖项。由于上述原因,这不会影响缓存。

    2021-06 更新:现在可以更改缓存目录

    正如下面的 cmets 所指出的,现在可以更改 location of NPM's cache directory。例如,通过将其作为参数传递给每个命令 (--cache .npm) 或环境变量 (npm_config_cache=.npm)。因此,将其更改为存储库中临时目录的路径add it to the CI cache stack,但将其从部署构建中排除。然后,您也可以在 CI 脚本中使用 --prefer-offline 参数。

    总结:

    • 拆分依赖项
    • 设置本地缓存目录
    • 使用npm ci --cache <local cache directory> --prefer-offline --only=production --silent
    • 这将加快进程,但由于命令设计,它不能像npm install 那样快

    【讨论】:

    【解决方案3】:

    您可以告诉您的 CI 缓存 npm 的缓存目录,然后使用选项 --prefer-offline--no-audit,例如:
    npm ci --prefer-offline --no-audit

    【讨论】:

      【解决方案4】:

      这对我很有帮助,虽然它可能只在本地有用 https://stackoverflow.com/a/61364681/9727824

      基本上使用npm ci --production 将跳过安装开发依赖项

      【讨论】:

      • 但是您通常希望开发依赖项运行单元测试之类的东西?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2013-05-17
      • 2017-03-21
      • 2014-11-12
      • 2013-03-07
      相关资源
      最近更新 更多