Firebase Functions monorepo部署失败、依赖未本地安装问题
根本原因
问题核心是Yarn Workspace依赖提升机制和Firebase Functions部署逻辑的适配问题,具体分两点:
- 第一次配置nohoist失败是规则写法错误。Yarn 1.x的nohoist规则按依赖路径匹配,最初写的
**/@company/server仅能匹配名为@company/server的依赖包,无法阻止该workspace包自身的第三方依赖被提升到根目录。而Firebase CLI部署函数时,仅会打包source字段指向的functions目录内的代码和依赖,不会读取根目录的node_modules,依赖缺失时会抛出「默认Firebase app不存在」的误导性报错——本质是核心依赖加载失败,并非业务代码漏写initializeApp()。 - 第二次在functions包内配置全量nohoist后仍部署失败,是旧版本Firebase CLI的工作目录bug导致的。在根目录执行部署命令时,旧版CLI解析函数触发器的工作目录不会自动切换到
source指定的functions路径,会优先从命令执行的根目录查找依赖,即使functions本地已经安装了全量依赖也无法被正确加载,只有手动进入functions目录执行部署才能正常运行。
解决步骤
按以下顺序操作即可实现根目录正常部署:
- 修正根目录
package.json的workspaces nohoist配置,正确规则需要同时覆盖workspace包本身和它的所有依赖,配置示例如下:
{ "private": true, "name": "@company/project", "version": "1.0.0", "description": "Project monorepo", "license": "MIT", "author": { "name": "Raul" }, "scripts": { "app": "yarn workspace @company/app start", "server": "yarn workspace @company/server start" }, "workspaces": { "packages": ["packages/*"], "nohoist": [ "**/@company/server", "**/@company/server/**" ] } }
注意:必须添加**/@company/server/**规则,才能匹配functions包下的所有第三方依赖,阻止依赖被提升到根目录。
- 执行全量清理重装依赖,命令如下:
# 删除所有位置的node_modules目录 rm -rf node_modules packages/*/node_modules # 清理yarn缓存 yarn cache clean # 重新安装依赖 yarn install
安装完成后检查packages/functions/node_modules目录,确认firebase-admin、firebase-functions等核心依赖都存在于该目录下,未被提升到根目录。
- 将全局Firebase CLI升级到最新版本,修复monorepo场景下的工作目录解析bug,升级命令:
# npm安装方式执行 npm install -g firebase-tools@latest # yarn安装方式执行 yarn global add firebase-tools@latest
- 兜底方案:如果升级CLI后仍存在根目录部署异常,可以在根目录
package.json中添加部署脚本,显式指定工作目录执行部署,无需手动切换目录:
{ "scripts": { "deploy:functions": "firebase deploy --only functions --cwd packages/functions" } }
后续直接在根目录执行yarn deploy:functions即可正常完成函数部署。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

