開始建立擴充功能

本頁將逐步引導您完成建立簡易 Firebase 所需的步驟 擴充功能,可安裝於專案中或與他人分享。這個 Firebase 擴充功能會監控應用程式的即時資料庫 的訊息並轉換為大寫。

1. 設定環境並初始化專案

必須先設定版本,才能開始建立擴充功能 取得必要工具

  1. 安裝 Node.js 16 以上版本。如要安裝節點,其中一種方法是使用 nvm (或 nvm-windows)。

  2. 安裝或更新至最新版的 Firebase CLI。目的地: 請使用 npm 安裝或更新,請執行下列指令:

    npm install -g firebase-tools

現在使用 Firebase CLI 初始化新的擴充功能專案:

  1. 為擴充功能建立目錄,並將 cd 加入該目錄:

    mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
  2. 執行 Firebase CLI 的 ext:dev:init 指令:

    firebase ext:dev:init

    系統顯示提示時,請選擇 JavaScript 做為函式語言 (但請注意, 您也可以在開發自己的擴充功能時使用 TypeScript 當系統要求您安裝依附元件時,請回答「是」。(採用 。這個指令會設定 新的擴充功能,您就可以開始開發擴充功能。

2. 使用模擬器試用擴充功能範例

Firebase CLI 初始化新的擴充功能目錄時,系統會建立 提供簡易函式範例和 integration-tests 目錄,其中包含 使用 Firebase 模擬器套件執行擴充功能所需的檔案。

嘗試在模擬器中執行範例擴充功能:

  1. 切換至 integration-tests 目錄:

    cd functions/integration-tests
  2. 使用示範專案啟動模擬器:

    firebase emulators:start --project=demo-test

    模擬器會將擴充功能載入預先定義的「虛擬」專案 (demo-test).到目前為止,擴充功能包含單一 HTTP 觸發 函式 greetTheWorld,可傳回「hello world」訊息出現時 允許或拒絕要求

  3. 確認模擬器仍在執行後,請嘗試使用擴充功能的 greetTheWorld 函式。

    瀏覽器會顯示「Hello World from greet-the-world」訊息。

  4. 這個函式的原始碼位於擴充功能的 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);
    });
    
  5. 模擬器執行期間,會自動重新載入您所做的任何變更 變為函式程式碼建議您稍微變更 greetTheWorld 函式:

    functions/index.js

    const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;
    

    儲存變更。模擬器會重新載入程式碼,現在當您執行 請造訪函式網址,就會看到更新後的問候語。

3. 為 extension.yaml 新增基本資訊

設定好開發環境後, 擴充功能模擬器,您就可以開始編寫自己的擴充功能。

第一步,編輯預先定義的擴充功能中繼資料,反映 建議編寫的副檔名,而非 greet-the-world。這項中繼資料 儲存在 extension.yaml 檔案中。

  1. 在編輯器中開啟 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 產品 其運作原理,後面附上擴充功能的說明 確實如此建議您在額外資訊中採用相同的慣例。

  2. 您變更了擴充功能名稱,因此您也必須更新 使用新名稱的模擬器設定:

    1. functions/integration-tests/firebase.json 後將 greet-the-world 變更為 至 rtdb-uppercase-messages
    2. 將「functions/integration-tests/extensions/greet-the-world.env」重新命名為 functions/integration-tests/extensions/rtdb-uppercase-messages.env

下列 greet-the-world 擴充功能仍有剩餘項目: 但請暫時保留這些副檔名您將在接下來的幾個階段更新 專區。

4. 編寫 Cloud 函式並宣告為擴充功能資源

您現在可以開始編寫程式碼了。在這個步驟中 負責執行擴充功能核心工作的函式 查看即時資料庫中的訊息,並將郵件轉換成大寫。

  1. 開啟擴充功能函式的來源 (位於擴充功能的 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 模組語法 (importexport) 而非 CommonJS (require)。如要在 Node 中使用 ES 模組, 在 functions/package.json 中指定 "type": "module"

    {
      "name": "rtdb-uppercase-messages",
      "main": "index.js",
      "type": "module",
      
    }
    
  2. 擴充功能中的每個函式都必須在 extension.yaml 中宣告 檔案。範例擴充功能將 greetTheWorld 宣告為擴充功能的唯一 Cloud 函式您現已替換為 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"
    
  3. 你的擴充功能目前使用即時資料庫做為觸發條件,因此你必須 更新模擬器設定,以執行 RTDB 模擬器,以及 Cloud Functions 模擬器:

    1. 如果模擬器仍在執行,請按下 Ctrl-C 鍵停止執行,

    2. functions/integration-tests 目錄中執行下列指令 指令:

      firebase init emulators

      系統詢問時,請略過預設專案設定,然後選取函式 以及資料庫模擬器接受預設通訊埠並允許進行設定 讓使用者下載任何必要檔案。

    3. 重新啟動模擬器:

      firebase emulators:start --project=demo-test
  4. 試用更新版擴充功能:

    1. 使用模擬器列印的連結開啟資料庫模擬器 UI 才是重點

    2. 編輯資料庫的根節點:

      • 欄位: messages
      • 類型: json
      • 值: {"11": {"original": "recipe"}}

      如果一切都正確,儲存資料庫變更時 擴充功能的 makeuppercase 函式應觸發並新增子項 錄製到訊息 11,其中包含「"upper": "RECIPE"」內容。一探究竟 並查看模擬器 UI 的記錄和資料庫分頁 預期的結果。

    3. 請嘗試在 messages 節點中新增更多子項 ({"original":"any text"}).每次新增記錄時, 擴充功能應新增含有大寫的 uppercase 欄位 在 original 欄位中的內容。

現在您已擁有在 RTDB 上運作的完整 (但簡單) 擴充功能 執行個體。在後續章節中,您將使用一些 其他功能接著,該擴充功能就能發布到 最後,一起瞭解如何在擴充功能中心發布擴充功能。

5. 宣告 API 和角色

Firebase 會授予已安裝擴充功能的每個執行個體 管理專案及其資料每個帳戶都有 至少要具備一組運作權限因此,您必須 明確宣告擴充功能所需的任何 IAM 角色;使用者安裝 Firebase 就會建立具有這些角色的服務帳戶 用來執行擴充功能

不需要宣告角色即可觸發產品事件,但您可以 就必須先宣告角色才能與其互動因為函式 已新增至即時資料庫所需的最後一個步驟,您必須將 向 extension.yaml 發出以下宣告:

roles:
  - role: firebasedatabase.admin
    reason: Allows the extension to write to RTDB.

同樣地,您可以在 apis 中宣告擴充功能使用的 Google API ] 欄位。使用者安裝擴充功能時,系統會詢問他們是否要 為專案自動啟用這些 API這通常 但本指南不需要。

6. 定義可由使用者設定的參數

您在最後兩個步驟中建立的函式,用於觀看特定 RTDB 位置 以便接收傳入的訊息。有時候,觀看特定地點的內容 例如當擴充功能在您指定的資料庫結構上執行時 僅供您的擴充功能使用不過,大多數情況下 使用者只要在自己的 Google Cloud 的 Resource Manager 工具 經特別設計,能以程式輔助方式協助您管理專案這樣使用者就能運用您的擴充功能 現有資料庫設定

讓擴充功能透過可由使用者設定的新訊息監控路徑:

  1. 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
    

    這會定義新的字串參數,當使用者設定 他們安裝了您的擴充功能

  2. 仍在 extension.yaml 檔案中,返回「makeuppercase」 宣告,並將 resource 欄位變更為:

    resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${param:MESSAGE_PATH}
    

    ${param:MESSAGE_PATH} 權杖是您剛才對參數的參照 擴充功能執行時,這個權杖會替換為 值就是使用者為該參數設定的值,結果則是 makeuppercase 函式會監聽使用者指定的路徑。你可以 就可以使用這個語法參照任何位置的使用者定義參數 extension.yaml (以及 POSTINSTALL.md 中,稍後會再詳細說明)。

  3. 您也可以透過函式程式碼存取使用者定義的參數。

    在上一節所編寫的函式中,您以硬式編碼的方式寫入 隨時注意變更將觸發條件定義改為參照 使用者定義的值:

    functions/index.js

    export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate
    

    請注意,在 Firebase Extensions 中,這項變更僅是為了 說明文件:如果 Cloud 函式以擴充功能的形式部署, 使用 extension.yaml 檔案中的觸發條件定義,並忽略 您在函式定義中指定的值。不過,有一個好方法 以便記錄這個值

  4. 在不執行階段進行程式碼變更時,您可能會感到失望 但重要的課程是,您可以存取任何 使用者定義的參數,並將其做為一般值使用 擷取文字。如果是這項功能,請新增下列記錄 的聲明,證明您確實存取 使用者定義:

    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.
        ...
    
  5. 系統通常會提示使用者在 安裝擴充功能。使用模擬器進行測試和開發時, 不過,您可以略過安裝程序,改為提供 ,使用 env 檔案建立使用者定義參數。

    開啟「functions/integration-tests/extensions/rtdb-uppercase-messages.env」 並使用下列內容取代 GREETING 定義:

    MESSAGE_PATH=/msgs/{pushId}/original
    

    請注意,上述路徑與預設路徑不同 先前定義的路徑這只是在嘗試 更新後的擴充功能,定義正在生效。

  6. 現在,重新啟動模擬器,然後再次造訪資料庫模擬器 UI。

    使用您在上方定義的路徑編輯資料庫的根節點:

    • 欄位: msgs
    • 類型: json
    • 值: {"11": {"original": "recipe"}}

    儲存資料庫變更時,擴充功能的 makeuppercase 函式應該如往常一樣觸發,但現在應該也能輸出 控制台記錄中的使用者定義參數。

7. 為使用者定義的邏輯提供事件掛鉤

身為擴充功能作者,您已瞭解 Firebase 產品如何觸發 擴充功能提供的邏輯:在即時資料庫中建立新記錄 觸發 makeuppercase 函式。擴充功能可以 與安裝擴充功能的使用者建立關係:擴充功能可以 user 定義的觸發邏輯。

擴充功能可以提供同步掛鉤非同步掛鉤,或同時提供這兩種機制。 同步掛鉤可讓使用者執行工作,阻止使用者完成 其中一個擴充功能的函式。這項功能很實用 舉例來說 ,在擴充功能執行之前,執行自訂預先處理。

在本指南中,您將新增非同步掛鉤至擴充功能 讓使用者能自行定義處理步驟,以在擴充功能執行後執行 會將大寫訊息寫入即時資料庫。非同步掛鉤使用 要觸發的 Eventarc 使用者定義的函式擴充功能會宣告其發出的事件類型 使用者安裝擴充功能時,選擇要讓他們存取的事件類型 如果使用者選擇至少一個事件,Firebase 就會佈建 擴充功能的 Eventarc 管道安裝程序。位使用者 然後部署自己的雲端函式來監聽該管道 當擴充功能發布新事件時觸發。

請按照下列步驟新增非同步掛鉤:

  1. 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)。

  2. 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酬載 大寫訊息。觸發事件的使用者定義函式可以 以便運用這項資訊

  3. 通常 EVENTARC_CHANNELEXT_SELECTED_EVENTS 環境 變數是根據使用者在執行期間選取的選項所定義 安裝。如要透過模擬器進行測試,請手動定義這些變數 在 rtdb-uppercase-messages.env 檔案中:

    EVENTARC_CHANNEL=locations/us-central1/channels/firebase
    EXT_SELECTED_EVENTS=test-publisher.rtdb-uppercase-messages.v1.complete
    

此時,您已完成新增非同步事件的必要步驟 按下至擴充功能的連結。

想要試用您剛實作的新功能,在接下來幾次 步驟,請假設安裝擴充功能的使用者角色:

  1. functions/integration-tests 目錄中初始化新的 Firebase 專案:

    firebase init functions

    系統顯示提示時,拒絕設定預設專案,請選取「JavaScript」做為 Cloud Functions 語言,然後安裝必要的依附元件。這個 專案代表使用者的專案,該專案已安裝擴充功能。

  2. 編輯 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 事件。 觸發事件後,就會在新出現的大小寫 撰寫新的電子郵件訊息

  3. 重新啟動模擬器。模擬器會將擴充功能的函式載入 以及後續處理函式,也就是「user」

  4. 前往資料庫模擬器使用者介面,並編輯資料庫的根節點,方法是使用 您在上方定義的路徑:

    • 欄位:msgs
    • 類型: json
    • 值: {"11": {"original": "recipe"}}

    儲存資料庫變更時,擴充功能的 makeuppercase 函式,且使用者的 extraemphasis 函式應依序觸發。 導致 upper 欄位取得 RECIPE!!! 值。

8. 新增生命週期事件處理常式

您到目前為止編寫的擴充功能會處理建立的訊息。但 如果使用者在安裝 擴充功能?Firebase Extensions 提供名為生命週期事件掛鉤的功能, 可以在安裝、更新 重新設定。在本節中,您將使用生命週期事件掛鉤來補充 專案現有的訊息資料庫,其中含大寫訊息的使用者 就會安裝擴充功能。

Firebase Extensions 會透過 Cloud Tasks 執行生命週期事件處理常式。個人中心 使用 Cloud Functions 定義事件處理常式;每當您的執行個體 擴充功能到達其中一個支援的生命週期事件時,如果您已定義 處理常式就會將處理常式新增至 Cloud Tasks 佇列。Cloud Tasks 會接著 以非同步方式執行處理常式執行生命週期事件處理常式時 Firebase 控制台會向使用者回報,擴充功能執行個體含有該擴充功能執行個體 正在處理的工作。處理常式函式是否可回報持續性 狀態及工作完成狀態傳回給使用者

如要新增用來補充現有訊息的生命週期事件處理常式,請進行以下操作: 包括:

  1. 定義由工作佇列事件觸發的新 Cloud 函式:

    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 逾時期間內完成的處理工作 函式。因為您無法預測使用者 安裝您的擴充功能後,這項策略就是 很適合使用。

  2. 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
    
  3. 雖然回填現有訊息是不錯的做法,但擴充功能可以 就算沒有該位址也能正常運作在這類情況下, 生命週期事件處理常式為選用項目

    方法是在 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 專案

雖然擴充功能模擬器是絕佳的 因此,您最好在開發期間 專案。

如要這麼做,請先設定新專案並啟用部分服務:

  1. Firebase 控制台新增 專案。
  2. 升級專案 升級至即付即用的 Blaze 方案Cloud Functions for Firebase 需要 因此您也必須擁有帳單帳戶 安裝擴充功能。
  3. 在新專案中,啟用即時資料庫
  4. 因為要測試擴充功能 安裝中,將一些範例資料匯入即時資料庫執行個體:
    1. 下載一些 種子 RTDB 資料
    2. 在 Firebase 控制台的「即時資料庫」頁面中,按一下 (更多) >匯入 JSON 然後選取剛才下載的檔案
  5. 如要啟用補充函式以使用 orderByChild 方法,請設定 資料庫針對 upper 的值建立訊息索引:

    {
      "rules": {
        ".read": false,
        ".write": false,
        "messages": {
          ".indexOn": "upper"
        }
      }
    }
    

接著,從本機來源將擴充功能安裝到新專案中:

  1. 為 Firebase 專案建立新目錄:

    mkdir ~/extensions-live-test && cd ~/extensions-live-test
    
  2. 初始化工作目錄中的 Firebase 專案:

    firebase init database

    系統提示時,請選取您剛剛建立的專案。

  3. 將擴充功能安裝在本機 Firebase 專案中:

    firebase ext:install /path/to/rtdb-uppercase-messages

    從這個表格可以看出 也能使用 Firebase CLI 工具的擴充功能務必選取「是」當 設定工具會詢問是否要針對現有資料庫進行補充作業。

    選取設定選項後,Firebase CLI 會儲存您的 ,並記錄擴充功能來源在 extensions 目錄中的設定 該檔案位於 firebase.json 檔案中。總而言之,這兩筆記錄是 擴充功能資訊清單使用者可以透過這個資訊清單 並部署到其他專案

  4. 將擴充功能設定部署至進行中的專案:

    firebase deploy --only extensions

如果一切順利,Firebase CLI 應將擴充功能上傳至專案 然後安裝這個應用程式安裝完成後,系統會執行補充作業工作, 系統將使用大寫字母更新資料庫。新增一些 新的節點傳送至訊息資料庫,並確保擴充功能正常運作 。

10. 撰寫說明文件

與使用者分享擴充功能之前,請確認你提供的內容充足 文件,說明成功的關鍵

初始化擴充功能專案時,Firebase CLI 會建立虛設常式 最低必要說明文件版本更新這些檔案,準確反映情況 呈現您建構的擴充功能

擴充功能.yaml

在您開發這個擴充功能時,這個檔案已經更新,因此 您現在不需要進行更多更新

不過,別擔心,這份說明文件 檔案。除了擴充功能的重要識別資訊之外,名稱、 說明、作者、官方存放區位置—extension.yaml 檔案內含使用者可查看的每個資源和使用者設定的說明文件 參數。這些資訊會顯示在 Firebase 控制台中。 Extensions Hub 和 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 檔案,以便為造訪 將佈建於擴充功能的存放區可以手動寫這個檔案或 使用指令

為達到本指南的目的,請略過撰寫 Readme 檔案的說明。

其他說明文件

上方所討論的說明文件是請至少參閱 為使用者提供更優異的體驗許多擴充功能都需要更多說明文件才能讓使用者 成功運用這些元素遇到這種情況時,建議您 說明文件並代管您為使用者導向的位置。

為達到本指南的目的,請略過撰寫更詳盡的說明文件。

11. 發布到 Extensions Hub

擴充功能編寫完成並記錄下來後,即可開始分享 從擴充功能中心與全世界分享但由於這只是教學課程 實際執行這項工作運用手邊資源 其他的 Firebase Extensions 發布商文件 並檢查 Firebase 編寫的官方擴充功能來源。

準備好在 Extensions Hub 上發布作品時,請按照下列步驟操作: 它:

  1. 如要發布第一個擴充功能 以擴充功能發布商的身分註冊。時間 註冊為額外資訊發布商時,您會建立發布商 ID 使用者能快速地認定您是擴充功能的作者。
  2. 將擴充功能的原始碼存放在可公開驗證的位置。時間 您可以從可驗證的來源取得程式碼,Firebase 可以發布 直接從這個位置匯入額外資訊如此可確保 發布目前發布的擴充功能版本,協助使用者 方法是讓使用者檢查要在專案中安裝的程式碼。

    這代表您的擴充功能目前必須在公開的 GitHub 中提供。 Cloud Storage 也提供目錄同步處理功能

  3. 使用 firebase ext:dev:upload將擴充功能上傳至 Extensions Hub 指令

  4. 前往 Firebase 控制台的發布商資訊主頁,找出擴充功能 然後按一下 [發布到擴充功能中心]這會要求 審查人員的審查,這可能需要幾天時間。獲得核准後, 擴充功能就會發布到擴充功能中心如果遭拒,您會收到 說明原因的訊息;即可解決回報的問題 重新送審。