今天我在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的答案:
- Is there a way to speedup npm ci using cache?
- Caching NPM dependencies in Azure pipeline for in-built windows-latest image
- 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/
你可以找到更多。为什么有这么多矛盾的信息?
完成
- 您是否应该结合
npm ci
使用Azure管道中的缓存任务。请解释您的答案! - 如果一致同意是,如果您希望加快安装速度,您应该:如果您不缓存
node_modules
,那么在npm ci
中使用缓存的好处是什么 - 如果一致同意不,那么我们可以做些什么来提高安装速度?
1条答案
按热度按时间wwtsj6pe1#
最重要的区别是缓存
node_modules
文件夹不同于缓存.npm
。node_modules
是运行npm i
或npm 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
标志,以便跳过对现有软件包版本的陈旧性检查,从而进一步加快您的管道速度。