如何在Firebase Functions默认目录外执行firebase deploy部署?
问题描述
我的工作区结构如下(其中app对应firebase init默认生成的functions文件夹):
server ├── app │ ├── controllers │ ├── middleware │ ├── db.js │ ├── index.js // 导出Firebase端点的文件 │ ├── router.js │ └── serve.js // Express应用 ├── dist ├── node_modules ├── firebase.json └── package.json
目前我能在根目录正常执行firebase serve本地运行函数,但执行firebase deploy时,必须把package.json和./dist文件夹都移到app目录才能成功。
请问有没有无需移动这两个文件,直接从根目录完成部署的方法?
我的package.json内容:
{ "main": "./dist/index.js", "name": "functions", "description": "Cloud Functions for Firebase", "scripts": { "prepare": "rm -rf dist && babel ./app/ -d ./dist && mkdir dist/private && cp app/private/conf.json dist/private/conf.json", "lint": "eslint app", "serve": "firebase serve --only dist", "shell": "firebase experimental:functions:shell", "start": "npm run shell", "deploy": "firebase deploy --only dist", "logs": "firebase functions:log" }, "dependencies": { "cors": "^2.8.4", "cross-fetch": "^2.1.0", "firebase-admin": "^5.12.1", "firebase-functions": "^1.0.3", "moment": "^2.22.1", "uuid": "^3.2.1" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.6.1", "babel-runtime": "^6.26.0", "eslint": "^4.12.0", "eslint-plugin-promise": "^3.6.0" }, "private": true }
我的firebase.json内容:
{ "functions": { "predeploy": [ "npm --prefix $RESOURCE_DIR run lint" ], "source": "dist" } }
解决方案
当然有办法不用移动文件,关键是调整firebase.json的配置和package.json的脚本,让Firebase部署时能正确识别你的项目结构。
步骤1:修改firebase.json配置
Firebase的functions.source需要指向包含package.json的目录(也就是你的根目录),同时调整predeploy脚本,让它在根目录执行lint和编译操作:
{ "functions": { "predeploy": [ "npm run lint", "npm run prepare" ], "source": ".", "runtime": "nodejs8" // 你的依赖版本偏旧,指定对应Node版本避免兼容问题 } }
这里的核心调整:
source设为.(根目录),因为package.json在这里predeploy直接调用根目录的脚本,不再依赖$RESOURCE_DIR变量- 新增
runtime指定Node.js 8,匹配你使用的firebase-functions@1.0.3版本要求
步骤2:调整package.json的脚本和字段
修正serve、deploy脚本的参数,并优化prepare脚本的健壮性:
{ "main": "./dist/index.js", // ... 其他内容不变 "scripts": { "prepare": "rm -rf dist && babel ./app/ -d ./dist && mkdir -p dist/private && cp app/private/conf.json dist/private/conf.json", "lint": "eslint app", "serve": "firebase serve --only functions", // 改成指定functions资源,而非dist目录 "shell": "firebase experimental:functions:shell", "start": "npm run shell", "deploy": "firebase deploy --only functions", // 同样修正为functions资源 "logs": "firebase functions:log" }, // ... 其他内容不变 }
注意细节:
- 把
--only dist改成--only functions,Firebase识别的是functions资源类型,不是目录名 mkdir dist/private改成mkdir -p dist/private,避免父目录不存在时出错
步骤3:验证部署流程
现在直接在根目录执行以下命令即可完成部署:
- 先执行
npm run prepare确保代码编译完成且资源文件复制到位 - 执行
firebase deploy --only functions触发部署
Firebase会从根目录读取package.json,用main字段指定的./dist/index.js作为函数入口,同时在部署前自动执行predeploy里的lint和prepare操作,完全不需要移动任何文件。
额外注意事项
- 确保
dist目录包含所有运行必需的文件(比如private/conf.json) - Firebase部署时会自动忽略
devDependencies,不用担心开发依赖被打包上传 - 如果遇到权限问题,检查
dist目录的读写权限是否正常
内容的提问来源于stack exchange,提问作者OctaviaLo
相关产品推荐
相关产品推荐

