NodeJS 在Azure管道中缓存npm ci是个坏主意吗?

xcitsw88  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(170)

今天我在Azure管道中查找了一些关于缓存和安装NPM包的信息。我们在管道中使用npm ci,这可能需要一段时间。缓存可能会加快速度(并引入其他风险),我想知道缓存npm ci在CI/CD管道中是否是个好主意,因为我发现了很多关于此的冲突信息。

缓存有什么好处?

如果我读一下正式文件,我会知道以下内容:
因为npm ci删除node_modules文件夹以确保使用一致的、可重复的模块集,所以在调用npm ci时应该避免缓存node_modules
使npm ci如此慢的原因是它必须检索所有node_modules。但是从上面的句子中我可以得出的唯一结论是我们不应该缓存node_modules。那么,如果node_modules没有缓存,* 为npm ci启用缓存任务 * 有什么意义呢?我的假设是,如果不缓存node_modules,您将失去高速缓存的速度优势。

缓存是危险的,对吧?

npm ci提供了基于package-lock.json的CLEAN安装,但是如果您将缓存添加到混合中,并从该高速缓存而不是服务器检索一些node_modules,则会产生检索陈旧/过时/错误包的风险,因为缓存无效很难。
基于此,缓存和npm ci不应该一起使用,对吗?

矛盾的信息

前面的标题告诉我,我不应该试图通过在Azure管道中使用缓存来提高npm ci的速度,但是如果你使用你最喜欢的搜索引擎搜索azure pipelines cache npm,你会发现很多资源告诉你如何做到这一点,包括来自Stack overflow的答案:

你可以找到更多。为什么有这么多矛盾的信息?

完成

  • 您是否应该结合npm ci使用Azure管道中的缓存任务。请解释您的答案!
  • 如果一致同意是,如果您希望加快安装速度,您应该:如果您不缓存node_modules,那么在npm ci中使用缓存的好处是什么
  • 如果一致同意,那么我们可以做些什么来提高安装速度?
wwtsj6pe

wwtsj6pe1#

最重要的区别是缓存node_modules文件夹不同于缓存.npm

  • node_modules是运行npm inpm ci时创建的文件夹。它包含未压缩的程序包,这些程序包基于package-lock.json中定义的依赖关系。

当你运行npm ci时,它会丢弃node_modules文件夹,这样它就可以基于你的package-lock构建一个新的依赖树,并对所有包含的软件包进行全新安装。
另一方面,npm i会根据您的package.json中的版本描述创建一个新的package-lock,然后只更新您的node_modules文件夹中的软件包。
这两个命令都首先检查该高速缓存中是否已经存在任何安装所需的版本。如果在缓存中找不到包,或者缓存的版本无效,它将从注册表下载新版本并更新缓存。

  • npm cache是NPM内部用来缓存特定包数据的。

该高速缓存的默认文件夹因操作系统而异,在大多数CI环境中无法访问Linux/Mac的默认文件夹(~/.npm)。
这就是为什么许多资源通过npm ci --cache .npm重新定义该高速缓存文件夹的原因。这让npm ci知道应该在**./.npm**中查找缓存,尽管当前工作空间中的任何路径都可能是有效的。
为了在不同CI管道之间保留此自定义文件夹,你可以通过Azure管道(或你使用的任何平台)再次缓存它。
重要提示:每当package-lock发生变化时,您在管道中定义该高速缓存必须失效并保存一个新版本,因为这意味着npm ci将需要安装新版本/包并相应地更新其npm缓存。
注意:您还可以添加--prefer-offline标志,以便跳过对现有软件包版本的陈旧性检查,从而进一步加快您的管道速度。

相关问题