本頁面會逐步說明如何建構簡單的 Firebase 擴充功能,並在專案中安裝或與他人共用。這個簡單的 Firebase 擴充功能範例會監控即時資料庫中的訊息,並將訊息轉換為大寫。
1. 設定環境並初始化專案
開始建構擴充功能前,請先設定建構環境,並安裝必要工具。
安裝 Node.js 16 以上版本。安裝 Node 的其中一種方式是使用 nvm (或 nvm-windows)。
安裝或更新至最新版本的 Firebase CLI。如要使用
npm
安裝或更新,請執行下列指令:npm install -g firebase-tools
現在請使用 Firebase CLI 初始化新的擴充功能專案:
為擴充功能建立目錄,然後
cd
到該目錄:mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
執行 Firebase CLI 的
ext:dev:init
指令:firebase ext:dev:init
系統提示時,請選擇 JavaScript 做為函式的語言 (但請注意,開發擴充功能時也可以使用 TypeScript),並在系統要求安裝依附元件時回答「yes」。(接受其他選項的預設值)。這個指令會為新擴充功能設定程式碼庫架構,您可從這裡開始開發擴充功能。
2. 使用模擬器試用範例擴充功能
Firebase CLI 初始化新的擴充功能目錄時,會建立簡單的範例函式和 integration-tests
目錄,其中包含使用 Firebase 模擬器套件執行擴充功能所需的檔案。
嘗試在模擬器中執行範例擴充功能:
切換至
integration-tests
目錄:cd functions/integration-tests
使用範例專案啟動模擬器:
firebase emulators:start --project=demo-test
模擬器會將擴充功能載入預先定義的「虛擬」專案 (
demo-test
)。目前擴充功能包含單一 HTTP 觸發函式greetTheWorld
,存取時會傳回「hello world」訊息。模擬器仍在執行時,請前往擴充功能啟動時列印的網址,嘗試使用擴充功能的
greetTheWorld
函式。瀏覽器會顯示「Hello World from greet-the-world」訊息。
這個函式的原始碼位於擴充功能的
functions
目錄。在您選擇的編輯器或 IDE 中開啟來源:functions/index.js
const functions = require("firebase-functions/v1"); exports.greetTheWorld = functions.https.onRequest((req, res) => { // Here we reference a user-provided parameter // (its value is provided by the user during installation) const consumerProvidedGreeting = process.env.GREETING; // And here we reference an auto-populated parameter // (its value is provided by Firebase after installation) const instanceId = process.env.EXT_INSTANCE_ID; const greeting = `${consumerProvidedGreeting} World from ${instanceId}`; res.send(greeting); });
模擬器執行期間,系統會自動重新載入您對函式程式碼所做的任何變更。請嘗試對
greetTheWorld
函式進行小幅變更:functions/index.js
const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;
儲存變更。模擬器會重新載入程式碼,現在只要前往函式網址,就會看到更新後的問候訊息。
3. 在 extension.yaml 中新增基本資訊
您已設定開發環境並執行擴充功能模擬器,現在可以開始編寫自己的擴充功能。
首先,請編輯預先定義的擴充功能中繼資料,以反映您要編寫的擴充功能,而非 greet-the-world
。這項中繼資料會儲存在 extension.yaml
檔案中。
在編輯器中開啟
extension.yaml
,然後將檔案的全部內容替換為下列內容:name: rtdb-uppercase-messages version: 0.0.1 specVersion: v1beta # Firebase Extensions specification version; don't change # Friendly display name for your extension (~3-5 words) displayName: Convert messages to upper case # Brief description of the task your extension performs (~1 sentence) description: >- Converts messages in RTDB to upper case author: authorName: Your Name url: https://your-site.example.com license: Apache-2.0 # Required license # Public URL for the source code of your extension sourceUrl: https://github.com/your-name/your-repo
請注意
name
欄位中使用的命名慣例:官方 Firebase 擴充功能會以字首表示擴充功能運作的主要 Firebase 產品,後面接著說明擴充功能的功能。您自己的擴充功能也應使用相同的慣例。由於您已變更擴充功能的名稱,因此也應使用新名稱更新模擬器設定:
- 在
functions/integration-tests/firebase.json
中,將greet-the-world
變更為rtdb-uppercase-messages
。 - 將
functions/integration-tests/extensions/greet-the-world.env
重新命名為functions/integration-tests/extensions/rtdb-uppercase-messages.env
。
- 在
擴充功能程式碼中仍有一些 greet-the-world
擴充功能的殘餘部分,但請暫時保留。您將在接下來的幾個章節中更新這些內容。
4. 編寫 Cloud 函式並宣告為擴充功能資源
現在可以開始編寫程式碼了。在這個步驟中,您將編寫 Cloud Function,執行擴充功能的中心工作,也就是監控即時資料庫中的訊息,並將訊息轉換為大寫。
在您選擇的編輯器或 IDE 中,開啟擴充功能函式的來源 (位於擴充功能的
functions
目錄中)。將其內容換成下列程式碼:functions/index.js
import { database, logger } from "firebase-functions/v1"; const app = initializeApp(); // Listens for new messages added to /messages/{pushId}/original and creates an // uppercase version of the message to /messages/{pushId}/uppercase // for all databases in 'us-central1' export const makeuppercase = database .ref("/messages/{pushId}/uppercase") .onCreate(async (snapshot, context) => { // Grab the current value of what was written to the Realtime Database. const original = snapshot.val(); // Convert it to upper case. logger.log("Uppercasing", context.params.pushId, original); const uppercase = original.toUpperCase(); // Setting an "uppercase" sibling in the Realtime Database. const upperRef = snapshot.ref.parent.child("upper"); await upperRef.set(uppercase); });
您取代的舊函式是 HTTP 觸發函式,會在存取 HTTP 端點時執行。這個新函式會由即時資料庫事件觸發:函式會監控特定路徑中的新項目,偵測到新項目時,會將值的大寫版本寫回資料庫。
順帶一提,這個新檔案會使用 ECMAScript 模組語法 (
import
和export
),而不是 CommonJS (require
)。如要在 Node 中使用 ES 模組,請在functions/package.json
中指定"type": "module"
:{ "name": "rtdb-uppercase-messages", "main": "index.js", "type": "module", … }
擴充功能中的每個函式都必須在
extension.yaml
檔案中宣告。範例擴充功能將greetTheWorld
宣告為擴充功能的唯一 Cloud Functions;現在您已將其替換為makeuppercase
,因此也需要更新其宣告。開啟
extension.yaml
並新增resources
欄位:resources: - name: makeuppercase type: firebaseextensions.v1beta.function properties: eventTrigger: eventType: providers/google.firebase.database/eventTypes/ref.create # DATABASE_INSTANCE (project's default instance) is an auto-populated # parameter value. You can also specify an instance. resource: projects/_/instances/${DATABASE_INSTANCE}/refs/messages/{pushId}/original runtime: "nodejs18"
由於擴充功能現在使用即時資料庫做為觸發條件,因此您需要更新模擬器設定,才能一併執行 RTDB 模擬器和 Cloud Functions 模擬器:
如果模擬器仍在執行,請按下 Ctrl-C 停止執行。
從
functions/integration-tests
目錄執行下列指令:firebase init emulators
系統詢問時,請略過設定預設專案,然後選取 Functions 和 Database 模擬器。接受預設連接埠,並允許設定工具下載任何必要檔案。
重新啟動模擬器:
firebase emulators:start --project=demo-test
試用更新後的擴充功能:
使用模擬器啟動時列印的連結,開啟資料庫模擬器 UI。
編輯資料庫的根節點:
- 欄位:
messages
- 類型:
json
- Value:
{"11": {"original": "recipe"}}
如果一切設定正確,當您儲存資料庫變更時,擴充功能的
makeuppercase
函式應會觸發,並將子項記錄新增至訊息 11,內容為"upper": "RECIPE"
。查看模擬器 UI 的記錄和資料庫分頁,確認結果是否符合預期。- 欄位:
嘗試在
messages
節點 ({"original":"any text"}
) 中新增更多子項。每當您新增記錄時,擴充功能應會新增uppercase
欄位,其中包含original
欄位的大寫內容。
您現在擁有完整 (但簡單) 的擴充功能,可在 RTDB 執行個體上運作。在接下來的章節中,您將新增一些額外功能,進一步完善這個擴充功能。接著,您將準備好將擴充功能發布給其他人,最後瞭解如何在擴充功能中心發布擴充功能。
5. 宣告 API 和角色
Firebase 會為已安裝擴充功能的每個執行個體,授予專案及其資料的有限存取權,方法是使用每個執行個體的服務帳戶。每個帳戶都具備運作所需的最低權限。因此,您必須明確宣告擴充功能所需的任何 IAM 角色;使用者安裝擴充功能時,Firebase 會建立已授予這些角色的服務帳戶,並使用該帳戶執行擴充功能。
您不需要宣告角色來觸發產品的事件,但需要宣告角色才能與產品互動。由於您在上一個步驟中新增的函式會寫入 Realtime Database,因此您需要在 extension.yaml
中新增下列宣告:
roles:
- role: firebasedatabase.admin
reason: Allows the extension to write to RTDB.
同樣地,您可以在 apis
欄位中宣告擴充功能使用的 Google API。使用者安裝擴充功能時,系統會詢問是否要為專案自動啟用這些 API。這通常只適用於非 Firebase 的 Google API,本指南不需要這項設定。
6. 定義可由使用者設定的參數
您在最後兩個步驟中建立的函式,會監控特定 RTDB 位置是否有傳入訊息。有時您確實會想監看特定位置,例如擴充功能在專供擴充功能使用的資料庫結構上運作時。不過,在大多數情況下,您會希望使用者在專案中安裝擴充功能時,可以設定這些值。這樣一來,使用者就能透過擴充功能,搭配現有的資料庫設定使用。
讓擴充功能監控新訊息的路徑可供使用者設定:
在
extension.yaml
檔案中,新增params
區段:- param: MESSAGE_PATH label: Message path description: >- What is the path at which the original text of a message can be found? type: string default: /messages/{pushId}/original required: true immutable: false
這會定義新的字串參數,系統會在使用者安裝擴充功能時提示設定。
在
extension.yaml
檔案中,返回makeuppercase
宣告並將resource
欄位變更為以下內容:resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${param:MESSAGE_PATH}
${param:MESSAGE_PATH}
權杖會參照您剛定義的參數。擴充功能執行時,這個權杖會替換為使用者為該參數設定的任何值,因此makeuppercase
函式會監聽使用者指定的路徑。您可以使用這個語法,在extension.yaml
中的任何位置參照任何使用者定義的參數 (以及POSTINSTALL.md
中的參數,稍後會詳細說明)。您也可以從函式程式碼存取使用者定義的參數。
在上一節中編寫的函式中,您已將路徑硬式編碼為要監看的變更。將觸發條件定義改為參照使用者定義的值:
functions/index.js
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate
請注意,在 Firebase 擴充功能中,這項變更純粹是為了文件:當 Cloud 函式部署為擴充功能的一部分時,會使用
extension.yaml
檔案中的觸發條件定義,並忽略函式定義中指定的值。不過,建議您在程式碼中記錄這個值的來源。程式碼變更後沒有任何執行階段效果,這或許令人失望,但請務必記住,您可以在函式程式碼中存取任何使用者定義的參數,並在函式的邏輯中將其做為一般值使用。為了表示您已瞭解這項功能,請新增下列記錄陳述式,證明您確實存取了使用者定義的值:
functions/index.js
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate( async (snapshot, context) => { logger.log("Found new message at ", snapshot.ref); // Grab the current value of what was written to the Realtime Database. ...
通常,使用者安裝擴充功能時,系統會提示他們提供參數值。不過,如果您使用模擬器進行測試和開發,則會略過安裝程序,改為使用
env
檔案提供使用者定義參數的值。開啟
functions/integration-tests/extensions/rtdb-uppercase-messages.env
,並將GREETING
定義替換為下列內容:MESSAGE_PATH=/msgs/{pushId}/original
請注意,上述路徑與預設路徑和先前定義的路徑不同;這只是為了在您嘗試更新擴充功能時,向自己證明定義已生效。
現在請重新啟動模擬器,然後再次前往資料庫模擬器 UI。
使用您在上方定義的路徑,編輯資料庫的根節點:
- 欄位:
msgs
- 類型:
json
- Value:
{"11": {"original": "recipe"}}
儲存資料庫變更時,擴充功能的
makeuppercase
函式應會像之前一樣觸發,但現在也應將使用者定義的參數列印到控制台記錄。- 欄位:
7. 提供使用者定義邏輯的事件掛鉤
身為擴充功能作者,您已瞭解 Firebase 產品如何觸發擴充功能提供的邏輯:在即時資料庫中建立新記錄會觸發 makeuppercase
函式。擴充功能與安裝擴充功能的使用者之間可以有類似的關係:擴充功能可以觸發使用者定義的邏輯。
擴充功能可以提供同步掛鉤、非同步掛鉤,或同時提供兩者。 同步掛鉤可讓使用者執行工作,阻止完成其中一項擴充功能。舉例來說,這項功能可讓使用者在擴充功能執行工作前,先進行自訂預先處理。
在本指南中,您將在擴充功能中新增非同步掛鉤,讓使用者定義自己的處理步驟,在擴充功能將大寫訊息寫入 Realtime Database 後執行。非同步掛鉤會使用 Eventarc 觸發使用者定義的函式。擴充功能會宣告發出的事件類型,使用者安裝擴充功能時,可以選擇感興趣的事件類型。如果選擇至少一個事件,Firebase 會在安裝程序中,為擴充功能佈建 Eventarc 管道。使用者接著可以部署自己的雲端函式,監聽該管道並在擴充功能發布新事件時觸發。
如要新增非同步掛鉤,請按照下列步驟操作:
在
extension.yaml
檔案中,新增以下區段,宣告擴充功能發出的單一事件類型:events: - type: test-publisher.rtdb-uppercase-messages.v1.complete description: >- Occurs when message uppercasing completes. The event subject will contain the RTDB URL of the uppercase message.
事件類型必須是全域不重複的,為確保不重複,請一律使用下列格式為事件命名:
<publisher-id>.<extension-id>.<version>.<description>
。(您目前沒有發布商 ID,因此暫時使用test-publisher
即可)。在
makeuppercase
函式的結尾,新增一些程式碼來發布您剛才宣告的型別事件:functions/index.js
// Import the Eventarc library: import { initializeApp } from "firebase-admin/app"; import { getEventarc } from "firebase-admin/eventarc"; const app = initializeApp(); // In makeuppercase, after upperRef.set(uppercase), add: // Set eventChannel to a newly-initialized channel, or `undefined` if events // aren't enabled. const eventChannel = process.env.EVENTARC_CHANNEL && getEventarc().channel(process.env.EVENTARC_CHANNEL, { allowedEventTypes: process.env.EXT_SELECTED_EVENTS, }); // If events are enabled, publish a `complete` event to the configured // channel. eventChannel && eventChannel.publish({ type: "test-publisher.rtdb-uppercase-messages.v1.complete", subject: upperRef.toString(), data: { "original": original, "uppercase": uppercase, }, });
這段範例程式碼會利用
EVENTARC_CHANNEL
環境變數只在使用者啟用至少一種事件類型時定義的事實。如果未定義EVENTARC_CHANNEL
,程式碼就不會嘗試發布任何事件。您可以將額外資訊附加至 Eventarc 事件。在上述範例中,事件具有
subject
欄位,其中包含對新建立值的參照,以及包含原始訊息和大寫訊息的data
酬載。觸發事件的使用者定義函式可運用這項資訊。一般來說,
EVENTARC_CHANNEL
和EXT_SELECTED_EVENTS
環境變數是根據使用者在安裝期間選取的選項定義。如要使用模擬器進行測試,請在rtdb-uppercase-messages.env
檔案中手動定義這些變數:EVENTARC_CHANNEL=locations/us-central1/channels/firebase EXT_SELECTED_EVENTS=test-publisher.rtdb-uppercase-messages.v1.complete
到目前為止,您已完成將非同步事件掛鉤新增至擴充功能所需的步驟。
如要試用剛實作的新功能,請在接下來的幾個步驟中,扮演安裝擴充功能的使用者:
從
functions/integration-tests
目錄初始化新的 Firebase 專案:firebase init functions
系統顯示提示訊息時,請拒絕設定預設專案,選取 JavaScript 做為 Cloud Functions 語言,然後安裝必要依附元件。這個專案代表使用者的專案,其中已安裝您的擴充功能。
編輯
integration-tests/functions/index.js
並貼上下列程式碼:import { logger } from "firebase-functions/v1"; import { onCustomEventPublished } from "firebase-functions/v2/eventarc"; import { initializeApp } from "firebase-admin/app"; import { getDatabase } from "firebase-admin/database"; const app = initializeApp(); export const extraemphasis = onCustomEventPublished( "test-publisher.rtdb-uppercase-messages.v1.complete", async (event) => { logger.info("Received makeuppercase completed event", event); const refUrl = event.subject; const ref = getDatabase().refFromURL(refUrl); const upper = (await ref.get()).val(); return ref.set(`${upper}!!!`); } );
這是使用者可能會編寫的後續處理函式範例。在本例中,函式會監聽擴充功能發布
complete
事件,並在觸發時,將三個驚嘆號加到新轉換為大寫的訊息中。重新啟動模擬器。模擬器會載入擴充功能的函式,以及「使用者」定義的後續處理函式。
前往資料庫模擬器 UI,使用您在上方定義的路徑編輯資料庫的根節點:
- 欄位:
msgs
- 類型:
json
- Value:
{"11": {"original": "recipe"}}
儲存資料庫變更時,擴充功能的
makeuppercase
函式和使用者的extraemphasis
函式應會依序觸發,導致upper
欄位取得RECIPE!!!
值。- 欄位:
8. 新增生命週期事件處理常式
您目前編寫的擴充功能會在訊息建立時處理訊息。但如果使用者在安裝擴充功能時,已經有訊息資料庫,該怎麼辦?Firebase Extensions 具有「生命週期事件掛鉤」功能,可在擴充功能安裝、更新或重新設定時觸發動作。在本節中,您將使用生命週期事件掛鉤,在使用者安裝擴充功能時,以大寫訊息回填專案的現有訊息資料庫。
Firebase Extensions 會使用 Cloud Tasks 執行生命週期事件處理常式。您可以使用 Cloud Functions 定義事件處理常式;每當擴充功能例項達到其中一個支援的生命週期事件時,如果已定義處理常式,系統就會將處理常式新增至 Cloud Tasks 佇列。接著,Cloud Tasks 會以非同步方式執行處理常式。生命週期事件處理常式執行時,Firebase 控制台會向使用者回報擴充功能例項正在處理工作。處理常式函式會負責向使用者回報進行中的狀態和工作完成情況。
如要新增生命週期事件處理常式,以回填現有訊息,請執行下列操作:
定義由工作佇列事件觸發的新 Cloud Function:
functions/index.js
import { tasks } from "firebase-functions/v1"; import { getDatabase } from "firebase-admin/database"; import { getExtensions } from "firebase-admin/extensions"; import { getFunctions } from "firebase-admin/functions"; export const backfilldata = tasks.taskQueue().onDispatch(async () => { const batch = await getDatabase() .ref(process.env.MESSAGE_PATH) .parent.parent.orderByChild("upper") .limitToFirst(20) .get(); const promises = []; for (const key in batch.val()) { const msg = batch.child(key); if (msg.hasChild("original") && !msg.hasChild("upper")) { const upper = msg.child("original").val().toUpperCase(); promises.push(msg.child("upper").ref.set(upper)); } } await Promise.all(promises); if (promises.length > 0) { const queue = getFunctions().taskQueue( "backfilldata", process.env.EXT_INSTANCE_ID ); return queue.enqueue({}); } else { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill complete."); } });
請注意,函式只會處理幾筆記錄,然後將自己加回工作佇列。這項策略通常用於處理無法在 Cloud Function 的逾時時間範圍內完成的處理工作。由於您無法預測使用者安裝擴充功能時,資料庫中可能已有多少訊息,因此這個策略很適合您。
在
extension.yaml
檔案中,將回填函式宣告為具有taskQueueTrigger
屬性的擴充資源:resources: - name: makeuppercase ... - name: backfilldata type: firebaseextensions.v1beta.function description: >- Backfill existing messages with uppercase versions properties: runtime: "nodejs18" taskQueueTrigger: {}
然後將函式宣告為
onInstall
生命週期事件的處理常式:lifecycleEvents: onInstall: function: backfilldata processingMessage: Uppercasing existing messages
雖然回填現有訊息很方便,但即使沒有這項功能,擴充功能仍可正常運作。在這種情況下,您應選擇性執行生命週期事件處理常式。
如要執行此操作,請在
extension.yaml
中新增參數:- param: DO_BACKFILL label: Backfill existing messages description: >- Generate uppercase versions of existing messages? type: select required: true options: - label: Yes value: true - label: No value: false
接著,在遞補函式的開頭,檢查
DO_BACKFILL
參數的值,如果未設定,請提早結束:functions/index.js
if (!process.env.DO_BACKFILL) { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped."); }
完成上述變更後,擴充功能會在安裝時將現有訊息轉換為大寫。
到目前為止,您已使用擴充功能模擬器開發擴充功能,並測試持續變更。不過,擴充功能模擬器會略過安裝程序,因此如要測試 onInstall
事件處理常式,您必須在實際專案中安裝擴充功能。不過,這也正好,因為新增這項自動遞補功能後,教學課程擴充功能現在已完成程式碼!
9. 部署至實際的 Firebase 專案
雖然擴充功能模擬器是開發期間快速疊代擴充功能的好工具,但您終究會想在實際專案中試用。
如要這麼做,請先設定新專案並啟用部分服務:
- 在 Firebase 控制台中新增專案。
- 將專案升級至即付即用的 Blaze 方案。Firebase 專案必須有帳單帳戶,才能使用 Cloud Functions for Firebase,因此您也需要帳單帳戶才能安裝擴充功能。
- 在新專案中啟用即時資料庫。
- 由於您想測試擴充功能在安裝時回填現有資料的能力,請將一些範例資料匯入即時資料庫執行個體:
- 下載一些初始 RTDB 資料。
- 在 Firebase 控制台的「Realtime Database」頁面中,依序點選 (更多) >「Import JSON」,然後選取剛才下載的檔案。
如要讓回填函式使用
orderByChild
方法,請將資料庫設為依upper
的值為訊息建立索引:{ "rules": { ".read": false, ".write": false, "messages": { ".indexOn": "upper" } } }
現在,請從本機來源將擴充功能安裝到新專案中:
為 Firebase 專案建立新目錄:
mkdir ~/extensions-live-test && cd ~/extensions-live-test
在工作目錄中初始化 Firebase 專案:
firebase init database
系統提示時,請選取您剛建立的專案。
將擴充功能安裝到本機 Firebase 專案:
firebase ext:install /path/to/rtdb-uppercase-messages
您可以在這裡瞭解使用者透過 Firebase CLI 工具安裝擴充功能時的體驗。設定工具詢問是否要回填現有資料庫時,請務必選取「是」。
選取設定選項後,Firebase CLI 會將設定儲存在
extensions
目錄中,並在firebase.json
檔案中記錄擴充功能來源位置。這兩項記錄統稱為擴充功能資訊清單。使用者可以透過資訊清單儲存擴充功能設定,並部署至不同專案。將擴充功能設定部署至正式專案:
firebase deploy --only extensions
如果一切順利,Firebase CLI 應會將擴充功能上傳至專案並安裝。安裝完成後,系統會執行回填工作,幾分鐘後,資料庫就會更新為大寫訊息。在訊息資料庫中新增一些節點,並確認擴充功能也適用於新訊息。
10. 撰寫說明文件
與使用者分享擴充功能前,請務必提供足夠的文件,協助他們順利使用。
初始化擴充功能專案時,Firebase CLI 會建立最低必要文件的存根版本。請更新這些檔案,準確反映您建構的擴充功能。
extension.yaml
您在開發這項擴充功能時,已更新過這個檔案,因此目前不需要再進行任何更新。
不過,請勿忽略這個檔案中文件的重要性。除了擴充功能的關鍵識別資訊 (名稱、說明、作者、官方存放區位置) 之外,extension.yaml
檔案還包含每個資源的使用者導向文件,以及使用者可設定的參數。使用者可以在 Firebase 控制台、擴充功能中心和 Firebase CLI 中查看這項資訊。
PREINSTALL.md
在這個檔案中,提供使用者安裝擴充功能前需要瞭解的資訊:簡要說明擴充功能的功能、說明任何必要條件,並提供安裝擴充功能對帳單的影響。如果網站上有其他資訊,也可以在這裡加入連結。
這個檔案的文字會顯示在擴充功能中心,以及 firebase ext:info
指令中。
以下是 PREINSTALL 檔案的範例:
Use this extension to automatically convert strings to upper case when added to
a specified Realtime Database path.
This extension expects a database layout like the following example:
"messages": {
MESSAGE_ID: {
"original": MESSAGE_TEXT
},
MESSAGE_ID: {
"original": MESSAGE_TEXT
},
}
When you create new string records, this extension creates a new sibling record
with upper-cased text:
MESSAGE_ID: {
"original": MESSAGE_TEXT,
"upper": UPPERCASE_MESSAGE_TEXT,
}
#### Additional setup
Before installing this extension, make sure that you've
[set up Realtime Database](https://firebase.google.com/docs/database/quickstart)
in your Firebase project.
#### Billing
To install an extension, your project must be on the
[Blaze (pay as you go) plan](https://firebase.google.com/pricing).
- This extension uses other Firebase and Google Cloud Platform services, which
have associated charges if you exceed the service's no-cost tier:
- Realtime Database
- Cloud Functions (Node.js 10+ runtime)
[See FAQs](https://firebase.google.com/support/faq#extensions-pricing)
- If you enable events,
[Eventarc fees apply](https://cloud.google.com/eventarc/pricing).
POSTINSTALL.md
這個檔案包含使用者成功安裝擴充功能後可參考的資訊,例如後續設定步驟、擴充功能運作範例等。
設定及安裝擴充功能後,Firebase 控制台會顯示 POSTINSTALL.md 的內容。您可以在這個檔案中參照使用者參數,系統會將這些參數替換為設定的值。
以下是教學課程擴充功能的安裝後檔案範例:
### See it in action
You can test out this extension right away!
1. Go to your
[Realtime Database dashboard](https://console.firebase.google.com/project/${param:PROJECT_ID}/database/${param:PROJECT_ID}/data) in the Firebase console.
1. Add a message string to a path that matches the pattern `${param:MESSAGE_PATH}`.
1. In a few seconds, you'll see a sibling node named `upper` that contains the
message in upper case.
### Using the extension
We recommend adding data by pushing -- for example,
`firebase.database().ref().push()` -- because pushing assigns an automatically
generated ID to the node in the database. During retrieval, these nodes are
guaranteed to be ordered by the time they were added. Learn more about reading
and writing data for your platform (iOS, Android, or Web) in the
[Realtime Database documentation](https://firebase.google.com/docs/database/).
### Monitoring
As a best practice, you can
[monitor the activity](https://firebase.google.com/docs/extensions/manage-installed-extensions#monitor)
of your installed extension, including checks on its health, usage, and logs.
CHANGELOG.md
此外,您也應在 CHANGELOG.md
檔案中記錄擴充功能版本之間的變更。
由於範例擴充功能先前從未發布,因此變更記錄只有一個項目:
## Version 0.0.1
Initial release of the _Convert messages to upper case_ extension.
README.md
大多數擴充功能也會提供讀我檔案,方便使用者瀏覽擴充功能的存放區。您可以手動編寫這個檔案,也可以使用指令產生讀我檔案。
在本指南中,請略過撰寫 README 檔案。
其他文件
上述文件是您應提供給使用者的最低文件集。許多擴充功能都需要更詳細的文件,使用者才能順利使用。在這種情況下,您應撰寫額外文件,並將其放在可供使用者參考的位置。
為了配合本指南,請略過撰寫更詳盡的說明文件。
11. 發布到擴充功能中心
擴充功能程式碼編寫完成並記錄在案後,即可在擴充功能中心向全球分享。但由於這只是教學課程,請勿實際執行這項操作。現在,您可以運用這裡和 Firebase 擴充功能發布商說明文件其他部分所學的知識,並參考 Firebase 官方擴充功能的來源,開始編寫自己的擴充功能。
準備好在擴充功能中心發布作品時,請按照下列步驟操作:
- 如果您要發布第一個擴充功能,請註冊為擴充功能發布者。註冊成為擴充功能發布商時,您會建立發布商 ID,讓使用者快速識別您是擴充功能的作者。
將擴充功能的原始碼存放在可公開驗證的位置。如果您的程式碼可從可驗證的來源取得,Firebase 就能直接從這個位置發布擴充功能。這麼做可確保您發布的是目前發布的擴充功能版本,並讓使用者檢查安裝到專案中的程式碼,進而提供協助。
目前,這表示您必須在公開的 GitHub 存放區中提供擴充功能。
使用
firebase ext:dev:upload
指令,將擴充功能上傳至擴充功能中心。前往 Firebase 控制台中的發布商資訊主頁,找出您剛上傳的擴充功能,然後按一下「發布至擴充功能中心」。這會要求審查人員進行審查,可能需要幾天的時間。通過核准後,擴充功能就會發布到擴充功能中心。如果遭到拒絕,您會收到說明原因的訊息,接著可以解決回報的問題,然後重新提交審查。