extension-to-functions-codebase について
Firebase ExtensionをローカルのCloud Functionsコードベース、または公開可能なnpmパッケージへ移行するためのスキルです。トリガーの更新、ライフサイクルフック、宣言的な設定を扱います。
主な機能
- 01ローカル関数またはnpmパッケージへの移行
- 02第1世代トリガーから第2世代への更新
- 03拡張機能のライフサイクルイベントの変換
- 04IAMロールとAPI要件の宣言
- 05インストールとエクスポート手順の作成
活用シーン
- 01拡張機能の処理をアプリ関数に統合
- 02拡張機能のコードを再利用可能なパッケージ化
- 03旧式のFirestore、タスク、HTTPトリガーの更新
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ firebase/ agent-skills --skill extension-to-functions-codebaseインストール後、Claude Code で/extension-to-functions-codebaseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/configuration-migration.mddestructuring-shim.mdsignature-mapping.md詳細
関数コードベースへの拡張機能の移行と npm パッケージへの移行
概要
Firebase Extension を、次のいずれかに移行します。
- ローカル Cloud Functions コードベース(アプリ統合用の
functions/src/)。 - 公開可能な npm パッケージ(V2 関数をエクスポートする、再利用可能なオープンソースパッケージ)。
ネイティブの Cloud Functions 機能(宣言型 IAM、パラメーター化設定、SDK ライフサイクルフック)を活用し、Destructuring Compatibility Shim を使用して第 1 世代のトリガーを第 2 世代に最新化します。
対象となる移行ワークフロー
-
対象 A:ローカル Functions コードベース(エンドユーザーアプリとの統合)
- 出力:
functions/src/配下のコード。設定は.envに記述します。 - デプロイ:
firebase deploy --only functions。
- 出力:
-
対象 B:公開可能な npm パッケージ/共有可能なパッケージ
- 出力:V2 関数をエクスポートする再利用可能な npm パッケージ。
- 設定:
exportsマップ、engines: { "node": ">=22" }、peerDependencies: { "firebase-functions": ">=6.0.0" }を指定するpackage.json。 - 使用方法:利用者はパッケージをインストールし、
index.tsで関数を再エクスポートします(export * from "<package-name>")。
主なルールと制約
1. 宣言型 IAM と API(ローカルでの作業をゼロに)
手動の gcloud スクリプトやコンソールでの手順ではなく、ネイティブ SDK の宣言を使用します。
- 必須の GCP IAM 権限には
requiresRole("roles/...")を使用します。 - Google API には
requiresAPI("service.googleapis.com", "Description")を使用します。
2. グローバルパラメーターへのアクセス制限
- モジュールのトップレベル読み込み時に
.value()を絶対に呼び出さないでください。 - グローバル SDK インスタンスは
onInit()内または遅延ゲッターで初期化します。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:Extension リソースの一覧を作成する
extension.yaml:params→defineString、defineInt、defineBoolean、defineSecret。apis→requiresAPI(...)。roles→requiresRole(...)。lifecycleEvents→afterFirstDeployとafterRedeploy。resources→ 第 1 世代のトリガーを第 2 世代にアップグレードします(onDocumentWritten、onTaskDispatched、onRequest)。
- ファイルとスクリプト: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" }- ESM/CommonJS と TypeScript 宣言(
lib/index.js、lib/index.d.ts)を対象とするexportsマップを設定します。
ステップ 3:トリガーを V1 から V2 にアップグレードする
- Firestore:
firebase-functions/v2/firestoreのonDocumentWrittenを使用します。 - Tasks:
firebase-functions/v2/tasksのonTaskDispatchedを使用します。タスクの登録時にEXT_INSTANCE_IDを削除します。 - HTTP:
firebase-functions/v2/httpsのonRequestを使用します。 - レガシーな第 1 世代のハンドラーが
(change, context)を期待する場合は、Destructuring Compatibility Shim({ change, context }、{ snapshot, context })を適用します。
ステップ 4:ライフサイクルイベントを変換する
Extension のライフサイクルイベントを src/index.ts の SDK ライフサイクルフックに対応付けます。
onInstall→afterFirstDeploy({ task: { function: "initTask" } })onUpdate/onConfigure→afterRedeploy({ task: { function: "setupTask" } })
ステップ 5:パッケージの README とエクスポート手順
次の内容を含む README.md を生成します。
- インストール手順(
npm install)。 - 再エクスポート用のコード(
export * from "<package-name>")。 - パラメーター化設定の
.env参照テーブル。 - 変更点(Extension とパッケージ)の比較テーブル。
注意:npm publish は絶対に実行しないでください。
コメント
Markdown 対応