npm ci
是使用CI时安装节点模块的最常用方法。
但是说实话,这真的很慢。
有没有一种方法可以使用缓存加速npm ci
或不完全删除现有软件包(整个node_modules文件夹)?
答案 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
将跳过安装开发依赖项