运维部署
把已安装的 Firebase Extension…
需要将 Firebase Extension(或扩展源码)转成本地 Cloud Functions 代码库或可复用 npm 包,并完成 V1 到 V2 触发器升级、生命周期钩子与声明式安全配置时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
把已安装的 Firebase Exten特定
解决思路
- 确定迁移目标:Target A 输出到 functions/src/ 的本地代码库,配置放在 .env,用 firebase deploy --only functions 部署;Target B 输出可复用 npm 包,导出 V2 functions,在 package.json 中配置 exports 映射、engines: { "node": ">=22" } 和 peerDependencies: { "firebase-functions": ">=6.0.0" },使用者安装后在 index.ts 中通过 export * from "<package-name>" 重新导出。
- 用声明式 IAM 与 API 替代手动 gcloud 脚本或控制台操作:用 requiresRole("roles/...") 声明所需 GCP IAM 权限,用 requiresAPI("service.googleapis.com", "Description") 声明所需 Google API。
- 不要在模块顶层调用 .value();在 onInit() 或惰性 getter 中初始化全局 SDK 实例,例如用 defineString("DATASET_ID") 定义参数,并在 onInit(() => { client = new BigQuery({ datasetId: dataset.value() }); }) 中初始化客户端。
- 处理 V2 并发与成本差异:V2 默认支持最多 80 并发请求,若要保持 V1 单并发计费,设置 cpu: "gcf_gen1"。
- Step 1 盘点扩展资源:读取 extension.yaml,把 params 映射为 defineString、defineInt、defineBoolean、defineSecret;把 apis 映射为 requiresAPI(...);把 roles 映射为 requiresRole(...);把 lifecycleEvents 映射为 afterFirstDeploy 和 afterRedeploy;把 resources 中的 1st Gen 触发器升级为 2nd Gen(onDocumentWritten、onTaskDispatched、onRequest);同时保留 devDependencies、测试框架(jest)和测试脚本。
- Step 2 配置 package.json:设置 name: "<package-name>"、engines: { "node": ">=22" };设置 peerDependencies 包含 "firebase-admin": "^11.0.0 || ^12.0.0" 和 "firebase-functions": ">=6.0.0";配置 exports 映射指向 ESM/CommonJS 和 TypeScript 声明文件(lib/index.js、lib/index.d.ts)。
- Step 3 将触发器从 V1 升级到 V2:Firestore 使用 firebase-functions/v2/firestore 的 onDocumentWritten;Tasks 使用 firebase-functions/v2/tasks 的 onTaskDispatched,并在入队任务时移除 EXT_INSTANCE_ID;HTTP 使用 firebase-functions/v2/https 的 onRequest;在旧 1st Gen 处理器期望 (change, context) 的地方应用解构兼容 shim({ change, context }、{ snapshot, context })。
- Step 4 转换生命周期事件:在 src/index.ts 中把 onInstall 映射为 afterFirstDeploy({ task: { function: "initTask" } }),把 onUpdate / onConfigure 映射为 afterRedeploy({ task: { function: "setupTask" } })。
- Step 5 生成 README.md,包含:npm install 安装说明、export * from "<package-name>" 重新导出片段、Parameterized Configuration .env 参考表、Extension 与 Package 差异对比表;注意绝不执行 npm publish。
适用边界 · 注意事项
- 没有 Firebase 项目或未安装 Firebase Extension/没有扩展源码时
- 目标不是迁移到 Cloud Functions 或 npm 包,而是继续直接使用原 Extension 时
- 需要发布到 npm 公共仓库时(本技能明确不执行 npm publish)