有没有一种方法可以使用缓存来加速npm ci?

wwodge7n  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(195)

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

58wvjzkj

58wvjzkj1#

NPM缓存位于~/.npm中,但在大多数配置项中,您只能缓存工作目录中的内容。
您可以通过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

编辑:刚刚发现您可以将config设置为命令行标志,因此npm ci --cache .npm也应该这样做

r6vfmomb

r6vfmomb2#

有一点
npm ci应该是CI中的首选项,因为它与package-lock.json文件有关。与npm install不同,npm install重写文件并始终安装新版本。
By design这个命令总是清除所有的本地包,在开始的时候删除node_modules目录。这是长构建的主要原因。并且没有选项来避免这种恼人的行为。
在本地机器上,您可以通过添加选项--prefer-offline来提高npm ci的速度,该选项告诉NPM忽略该高速缓存最小时间,并立即使用本地缓存的包,而不是根据注册表验证它们。
但是,NPM缓存位于Unix上的~/.npm,或Windows上的%AppData%/npm-cache。默认情况下,这些文件夹在大多数配置项中是不可缓存的。例如,GitLab配置项缓存仅将存储库作为可用工作区。其他目录如主目录或系统目录(如apt)不会被缓存。因此,此设置可能不会影响您的配置项构建时间。
在旧版本的NPM中,选项--progress=false通过删除进度条对构建时间有很大的影响。这个问题似乎已经消失了,但是我不能再测量值得注意的差异了。
一个最好的实践和绝对的速度增益是separate packages into production and development。通过传递选项--only=production,NPM将忽略开发依赖项。由于上述原因,这不会影响缓存。

  • 2021年6月更新:现在可以更改该高速缓存目录 *

正如下面的注解所指出的,现在可以改变NPM的缓存目录的位置。(--cache .npm)或环境变量(npm_config_cache=.npm)。因此,将其更改为存储库中临时目录的路径,请将其添加到CI缓存堆栈中,但从部署构建中排除。然后,您还可以在CI脚本中使用--prefer-offline参数。
总结:

  • 分割相依性
  • 设置本地缓存目录
  • 使用npm ci --cache <local cache directory> --prefer-offline --only=production --silent
  • 这将加快该过程,但由于命令设计的原因,它的速度不如npm install
4nkexdtk

4nkexdtk3#

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

z31licg0

z31licg04#

这对我很有帮助,尽管它可能只在本地有用https://stackoverflow.com/a/61364681/9727824
基本上使用npm ci --production,这将跳过安装设备依赖项。
编辑:NPM的后续版本建议使用npm ci --omit=dev,如此处所述。

相关问题