有没有一种方法可以通过缓存来加快 npm ci 的速度?
NPM是一个流行的JavaScript软件包管理器,用于安装和管理项目中的依赖项。在持续集成(CI)环境中,使用npm ci命令可以快速安装依赖项并生成可重现的构建。
然而,使用npm ci命令可能会导致构建时间较长的问题。这是因为npm ci在开始之前会删除所有本地包,这是其设计的一部分。此外,NPM缓存默认情况下无法在大多数CI中进行缓存,这也会影响构建时间。
有几种方法可以加快npm ci的速度。首先,可以在本地机器上使用--prefer-offline选项,这会告诉NPM忽略缓存最小时间,并立即使用本地缓存的包,而不是通过注册表验证它们。然而,这种设置可能不会影响CI构建时间,因为大多数CI只缓存存储库作为可用的工作区,而不包括像主目录或系统目录(如apt)这样的目录。
在较旧的NPM版本中,使用--progress=false选项可以显著减少构建时间,通过去除进度条。然而,这个问题似乎已经解决了,我无法再测量到明显的差异。
另一个加快速度的最佳实践是将依赖项分成生产和开发两部分。通过传递--only=production选项,NPM将忽略开发依赖项。由于上述原因,这不会影响缓存。
最新的更新中,现在可以更改NPM缓存目录的位置。通过将其作为命令的参数(--cache .npm)或环境变量(npm_config_cache=.npm)传递,可以将NPM的缓存目录更改为临时目录的路径。然后,将其添加到CI缓存堆栈中,但在部署构建中排除它。然后,您将能够在CI脚本中使用--prefer-offline参数。
加快npm ci速度的方法包括拆分依赖项、设置本地缓存目录以及使用命令npm ci --cache
在GitLab CI中,可以使用缓存技术来缓存npm ci的结果,具体方法可以参考GitLab的官方文档。
总之,通过采取上述措施,可以提高npm ci的速度,从而在CI环境中更快地安装依赖项并生成构建。
NPM cache 是位于 `~/.npm` 目录下的,但在大多数 CI(持续集成)中,你只能缓存工作目录内的内容。
为了绕过这个问题,你可以将缓存目录更改为当前目录,使用命令 `npm set cache .npm`。这样,NPM cache 将被定位在 `./.npm` 目录下,并且你可以在 CI 作业之间缓存这个文件夹。
以下是在 GitLab CI 中的示例:
my-super-job:
image: node:13-alpine
script:
- npm set cache .npm
- npm ci
cache:
paths:
- .npm
编辑:刚刚发现你可以通过命令行标志来设置配置,所以 `npm ci --cache .npm` 也可以达到同样的效果。
NPM Cache 目录可以设置为环境变量吗?