在 Azure Pipelines 中缓存 npm ci 是一个坏主意吗?

问题描述 投票:0回答:1

今天我正在查找一些有关 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?
  • 在 Azure 管道中缓存 NPM 依赖项以获取内置 Windows 最新映像
  • https://packetlost.com/blog/2021/01/31/speed-up-azure-devops-pipelines-with-node_modules-caching/
  • https://qxperts.io/caching-your-node-modules-in-azure-devops-2/
您还可以找到更多。为什么会有这么多相互矛盾的信息?

整理完毕

    您是否应该将 Azure 管道中的缓存任务与
  • npm ci
     结合使用。请解释你的回答理由!
  • 如果共识是
  • 是,如果您想加快安装速度,您应该:如果您不缓存 npm ci
    ,使用缓存与 
    node_modules
    有什么好处
  • 如果共识是
  • ,那么我们可以做些什么来提高安装速度?
node.js npm caching continuous-integration azure-pipelines
1个回答
4
投票
最重要的区别是缓存

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 缓存。
注意:您还可以添加 

--prefer-offline

 标志,以跳过对现有包版本的过时检查,从而进一步加快管道速度。


TL;博士

是的!

您应该使用npm ci。并且,您可以使用缓存来提高速度。

但是
你不应该缓存node_modules。相反,缓存“npm 缓存文件夹”。将
--cache "custom/folder/path"
标志与
npm ci
一起使用,以确保 npm 缓存的位置对于每个环境都是相同的。
    

© www.soinside.com 2019 - 2024. All rights reserved.