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

时间:2019-03-18 21:57:00

标签: node.js caching npm continuous-integration

目前,

npm ci是使用CI时安装节点模块的最常用方法。 但是说实话,这真的很慢。 有没有一种方法可以使用缓存加速npm ci或不完全删除现有软件包(整个node_modules文件夹)?

4 个答案:

答案 0 :(得分:13)

NPM缓存位于Text中,但是在大多数配置项中,您只能在工作目录中缓存内容。

您可以采取以下措施来解决此问题:使用~/.npm将缓存目录更改为当前目录。 NPM缓存现在将位于npm set cache .npm中,您可以在CI作业之间缓存该文件夹。

GitLab CI示例:

./.npm

编辑:刚刚发现您可以set the config as a command line flag,所以my-super-job: image: node:13-alpine script: - npm set cache .npm - npm ci cache: paths: - .npm 应该做同样的事

答案 1 :(得分:2)

tl;博士编号

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

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

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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