Community编程与开发github.com

扩展转函数代码库与npm包迁移

将已安装的 Firebase 扩展(或扩展源码)转换为独立的 Cloud Functions for Firebase 代码库或可发布的 npm 包,包括 V1 到 V2 触发器升级、生命周期钩子和声明式安全。

扩展转函数代码库与npm包迁移 是什么?

该技能旨在帮助开发者将 Firebase 扩展迁移为两种形式之一:是作为本地 Cloud Functions 代码库(集成到应用项目中的 functions/src/ 目录),还是作为可发布、可复用的 npm 包(导出 V2 函数)。它利用原生 Cloud Functions 特性,如声明式 IAM 权限(requiresRole)、参数化配置(defineString/defineInt)和 SDK 生命周期钩子(onInit, afterFirstDeploy)。同时,该技能通过解构兼容性垫片(Destructuring Compatibility Shim)将第一代触发器(V1)升级为第二代(V2),并处理并发与成本策略。该技能支持所有基于 Firebase 的 Agent 平台(如 Claude Code, Cursor, Codex),并提供了详细的步骤指导,包括扩展资源盘点、package.json 配置、触发器升级和生命周期事件转换。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/momabrouk18-eng/Website/tree/HEAD/.agents/skills/extension-to-functions-codebase

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

扩展转函数代码库与 npm 包迁移

概述

将 Firebase 扩展迁移为以下两种形式之一:

  1. 本地 Cloud Functions 代码库(functions/src/,用于应用集成)。
  2. 可发布的 npm 包(可复用的开源包,导出 V2 函数)。

利用原生 Cloud Functions 特性(声明式 IAM、参数化配置、SDK 生命周期钩子),并使用解构兼容性垫片将第一代触发器升级为第二代。


目标迁移工作流

  • 目标 A:本地函数代码库(最终用户应用集成)

    • 输出:代码位于 functions/src/,配置位于 .env。
    • 部署:firebase deploy --only functions。
  • 目标 B:可发布的 npm 包 / 可共享包

    • 输出:可复用的 npm 包,导出 V2 函数。
    • 配置:package.json 指明 exports 映射、engines: { "node": ">=22" } 和 peerDependencies: { "firebase-functions": ">=6.0.0" }。
    • 使用方式:消费者安装包后,在 index.ts 中重新导出函数(export * from "<package-name>")。

核心规则与约束

1. 声明式 IAM 与 API(零本地开销)

使用原生 SDK 声明,而非手动 gcloud 脚本或控制台指令:

  • 使用 requiresRole("roles/...") 声明所需的 GCP IAM 权限。
  • 使用 requiresAPI("service.googleapis.com", "Description") 声明所需的 Google API。

2. 全局参数访问限制

  • 禁止在模块顶层加载作用域中调用 .value()。
  • 在 onInit() 或惰性 getter 中初始化全局 SDK 实例:
    import { defineString } from "firebase-functions/params";
    import { onInit } from "firebase-functions/v2";
    
    const dataset = defineString("DATASET_ID");
    let client: BigQuery;
    
    onInit(() => {
      client = new BigQuery({ datasetId: dataset.value() });
    });
    

3. V2 并发与成本对等

V2 默认启用并发(最多 80 个请求)。若要保留 V1 的单并发计费模式,请设置 cpu: "gcf_gen1"。


逐步迁移执行

步骤 1:盘点扩展资源

  1. extension.yaml:
    • params → defineString、defineInt、defineBoolean、defineSecret。
    • apis → requiresAPI(...)。
    • roles → requiresRole(...)。
    • lifecycleEvents → afterFirstDeploy 和 afterRedeploy。
    • resources → 将第一代触发器升级为第二代(onDocumentWritten、onTaskDispatched、onRequest)。
  2. 文件与脚本:保留 devDependencies、测试框架(jest)和测试脚本。

步骤 2:配置 package.json

  • 设置 name: "<package-name>"、engines: { "node": ">=22" }。
  • 设置 peerDependencies:
    "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)。

步骤 3:将触发器从 V1 升级到 V2

  • Firestore:使用 firebase-functions/v2/firestore 中的 onDocumentWritten。
  • Tasks:使用 firebase-functions/v2/tasks 中的 onTaskDispatched。入队任务时移除 EXT_INSTANCE_ID。
  • HTTP:使用 firebase-functions/v2/https 中的 onRequest。
  • 在需要兼容旧版第一代处理器的位置应用解构兼容性垫片({ change, context }、{ snapshot, context })。

步骤 4:转换生命周期事件

将扩展生命周期事件映射为 SDK 生命周期钩子,位于 src/index.ts:

  • onInstall → afterFirstDeploy({ task: { function: "initTask" } })
  • onUpdate / onConfigure → afterRedeploy({ task: { function: "setupTask" } })

步骤 5:生成包 README 与导出说明

生成 README.md,包含:

  1. 安装说明(npm install)。
  2. 重新导出代码片段(export * from "<package-name>")。
  3. 参数化配置 .env 引用表。
  4. 变更对比表(扩展 vs 包)。

提醒:切勿执行 npm publish。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能