You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:验证部署流程

现在直接在根目录执行以下命令即可完成部署:

  1. 先执行npm run prepare确保代码编译完成且资源文件复制到位
  2. 执行firebase deploy --only functions触发部署

Firebase会从根目录读取package.json,用main字段指定的./dist/index.js作为函数入口,同时在部署前自动执行predeploy里的lint和prepare操作,完全不需要移动任何文件。

额外注意事项

  • 确保dist目录包含所有运行必需的文件(比如private/conf.json)
  • Firebase部署时会自动忽略devDependencies,不用担心开发依赖被打包上传
  • 如果遇到权限问题,检查dist目录的读写权限是否正常

内容的提问来源于stack exchange,提问作者OctaviaLo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:50