Firebase Functions部署失败 提示找不到/shared/package.json文件
错误根因
Firebase Functions 部署时默认仅上传backend/functions目录下的内容到云端构建环境,你引用的shared目录位于functions目录的上层,云端构建环境中不存在../../shared这个路径,因此npm安装依赖时无法找到对应的包文件,才会抛出ENOENT报错。前端本地开发时可以正常访问项目根目录下的shared文件夹,所以不会触发该错误。
可行解决方案
方案1:使用npm pack打本地压缩包(改造成本最低)
- 进入
shared目录执行npm pack命令,执行完成后会生成类似my-shared-1.0.0.tgz的压缩包文件 - 在
backend/functions目录下新建local-packages文件夹,将上面生成的tgz文件移入该文件夹 - 修改functions的package.json中的依赖配置为:
"my-shared": "file:./local-packages/my-shared-1.0.0.tgz" - 后续更新shared代码后,重新执行pack命令覆盖tgz文件即可正常部署
方案2:修改firebase配置,上传shared目录到构建环境
- 打开
backend/firebase.json,修改functions配置项,将部署根目录调整为backend目录,同时配置ignore规则过滤不需要上传的文件,示例配置如下:{ "functions": { "source": ".", "ignore": [ "node_modules", ".git", "frontend/**", "**/node_modules/**" ], "predeploy": [ "npm --prefix ./shared run build", "npm --prefix ./functions run build" ] } } - 同步修改functions的package.json中的依赖路径为相对于新部署根目录的路径:
"my-shared": "file:../shared" - 该方案无需每次手动打压缩包,shared代码更新后直接执行部署命令即可,predeploy配置会自动先编译共享包再部署
方案3:使用Monorepo工具管理(适合中大型项目)
如果项目后续会新增更多共享模块,可以采用pnpm Workspace、Nx等Monorepo管理工具,配置依赖打包规则,部署时自动将共享包的产物打包进functions的构建输出中,该方案改造成本较高,但长期维护性更好。
注意事项
无论采用哪种方案,部署前都要确保shared目录已经执行过npm run build命令,编译生成了lib目录下的产物,否则即使路径配置正确也会出现找不到导出模块的错误。
内容的提问来源于stack exchange,提问作者Yetispapa
相关产品推荐
相关产品推荐

