如何基于Yarn 3优化Firebase Functions部署速度?
优化Firebase Functions部署速度:Yarn 3缓存失效与依赖安装慢的解决方案
问题背景
- 优化Firebase Functions部署速度时,发现Cloud Build服务端会重新下载安装
package.json中的依赖,因缺少package-lock.json需重新计算所有依赖版本 - 项目采用Yarn 3单工作区,仅一个Yarn锁定文件;通过
package.json的engines字段指定Yarn版本后,解决了Firebase默认用Yarn 1导致的部署失败问题 - 实际测试发现Yarn 3安装比无lockfile的npm更慢,每次都要重新下载所有依赖;尝试用Yarn PnP模式但受限于Firebase Functions的100MB大小限制,删除缓存中的大依赖后,上传缓存时buildpack自动切换为
--immutable-cache模式,但缓存仍未生效 - 目前考虑在客户端用npm安装生成
package-lock.json以利用服务端缓存,但更希望通过Yarn 3优化部署速度(部署是CI中耗时最长环节),求可行配置方案,尤其是让Yarn 3缓存生效的方法
可行解决方案
1. 强制Cloud Build识别Yarn 3缓存路径
Firebase默认的Cloud Build环境可能没正确适配Yarn 3的缓存目录,需手动配置缓存挂载路径并明确指定缓存位置:
- 修改或创建根目录的
.firebaserc,添加缓存配置:{ "projects": { "default": "你的项目ID" }, "build": { "cache": { "paths": [ "~/.yarn/cache/**/*", ".yarn/unplugged/**/*", ".yarn/install-state.gz" ] } } } - 在
package.json的脚本里指定Yarn安装的缓存目录:{ "scripts": { "deploy:functions": "yarn install --cache-folder ~/.yarn/cache --immutable && firebase deploy --only functions" } } - 确保
.yarnrc.yml开启缓存:cacheFolder: ~/.yarn/cache enableImmutableInstalls: true
2. 用Yarn 3 Zero-Installs模式(规避100MB限制)
Zero-Installs会把依赖缓存和安装状态提交到Git,Cloud Build无需重新下载,针对大依赖可以拆分处理:
- 在
.yarnrc.yml开启Zero-Installs:enableZeroInstalls: true - 修改
.gitignore,把Yarn缓存相关文件加入提交列表:!.yarn/cache !.yarn/unplugged !.yarn/install-state.gz !.pnp.cjs - 对超过100MB的大依赖(比如大型SDK、模型文件),不要打包进部署包,改成上传到Cloud Storage,函数运行时按需下载。
3. 自定义Cloud Build配置强制缓存策略
如果默认Buildpack自动切换--immutable-cache导致缓存失效,直接写cloudbuild.yaml指定缓存规则:
steps: - name: 'gcr.io/cloud-builders/yarn' args: ['install', '--cache-folder', '/builder/home/.yarn/cache', '--immutable-cache'] volumes: - name: 'yarn_cache' path: '/builder/home/.yarn/cache' - name: 'gcr.io/cloud-builders/firebase' args: ['deploy', '--only', 'functions'] volumes: - name: 'yarn_cache' persistentVolumeClaim: claimName: 'yarn-cache-pvc'
需要在GCP控制台创建对应的持久化卷声明(PVC),让缓存可以跨构建复用。
4. 折中方案:客户端生成package-lock.json用npm缓存
如果Yarn 3缓存始终不生效,退而求其次用npm的缓存机制:
- 在CI流程里先执行
npm install生成package-lock.json,再部署:npm install && firebase deploy --only functions - 在
.firebaserc配置npm缓存路径:{ "build": { "cache": { "paths": [ "~/.npm/**/*" ] } } }
关键注意事项
- 确保Firebase CLI是最新版本,避免旧版本对Yarn 3支持不足
- 用Yarn工作区的话,要在
firebase.json里指定函数的工作区路径:{ "functions": { "source": "./packages/functions", "predeploy": ["yarn workspace @你的项目名/functions install"] } } - 定期清理无效缓存,防止缓存过大触发部署包大小限制
内容的提问来源于stack exchange,提问作者Paul Weber
相关产品推荐
相关产品推荐

