今天我正在查找一些有关 Azure Pipelines 中的缓存以及安装 NPM 包的信息。我们在管道中使用
npm ci
,这可能需要一段时间。缓存可能会加快速度(并引入其他风险),我想知道缓存npm ci
在 CI/CD 管道中是否是一个好主意,因为我发现了很多关于此的相互矛盾的信息。
如果我阅读了官方文档,内容如下:
因为
会删除npm ci
文件夹以确保使用一致、可重复的模块集,所以在调用node_modules
时应避免缓存node_modules
。npm ci
使
npm ci
如此缓慢的原因是它必须检索所有 node_modules
。但我从上面这句话中可以得出的唯一结论是我们不应该缓存node_modules
。那么,如果 npm ci
未缓存,那么为 node_modules
启用缓存任务有什么意义呢?我的假设是,如果不缓存
node_modules
,您就会失去缓存的速度优势。缓存很危险,对吧?
npm ci
提供基于
package-lock.json
的干净安装。但是,如果您将缓存添加到混合中并从缓存而不是服务器检索一些
node_modules
,则会产生检索陈旧/过时/错误包的风险,因为缓存失效很难。基于此,缓存和
npm ci
永远不应该一起使用,对吧?信息冲突
npm ci
更快。但如果您使用您最喜欢的搜索引擎并搜索
azure pipelines cache npm
,您会发现很多资源告诉您具体如何执行此操作。包括堆栈溢出的答案:
整理完毕
npm ci
结合使用。请解释你的回答理由!
npm ci
,使用缓存与 node_modules
有什么好处
node_modules
文件夹与缓存
.npm
不同。
node_modules
是运行
npm i
或
npm ci
时创建的文件夹。它包含未压缩的包,基于
package-lock.json
中定义的依赖关系。
npm ci
时,它会丢弃
node_modules
文件夹,因此它可以基于您的
package-lock
构建新的依赖关系树,并对所有包含的软件包进行全新安装。另一方面,
npm i
会根据您的
package-lock
中的版本描述创建一个新的
package.json
。然后它只会更新您的
node_modules
文件夹中版本已更改的软件包。这两个命令首先检查缓存中是否已存在任何请求的版本以供安装。如果在您的缓存中找不到该软件包,或者缓存的版本无效,它将从注册表下载新版本并更新缓存。
缓存的默认文件夹因操作系统而异,并且在大多数 CI 环境中无法访问 Linux/Mac (
~/.npm
) 的默认文件夹。这就是为什么许多资源通过
npm ci --cache .npm
重新定义缓存文件夹。这让
npm ci
知道在 ./.npm
处查找缓存,尽管当前工作空间内的任何路径都可能有效。为了在不同的 CI 管道之间保留此自定义文件夹,您可以通过 Azure Pipelines(或您使用的任何平台)再次缓存它。
重要提示:每当
package-lock
更改时,您在管道中定义的缓存必须失效并保存新版本,因为这意味着
npm ci
将需要安装新版本/包并相应地更新其 npm 缓存。注意:您还可以添加 标志,以跳过对现有包版本的过时检查,从而进一步加快管道速度。
:
是的!您应该使用npm ci
。并且,您可以使用缓存来提高速度。
但是你不应该缓存
node_modules
。相反,缓存“npm 缓存文件夹”。将 --cache "custom/folder/path"
标志与 npm ci
一起使用,以确保 npm 缓存的位置对于每个环境都是相同的。