Uzantı oluşturmaya başlayın

Bu sayfada, basit bir Firebase hesabı oluşturmak için gerekli adımlar açıklanmaktadır. Projelerinize yükleyebileceğiniz veya başkalarıyla paylaşabileceğiniz uzantı. Bu basit bir Firebase uzantısı örneğiyle birlikte Realtime Database'inizi büyük harfe dönüştürür.

1. Ortamınızı kurma ve projeyi başlatma

Uzantı oluşturmaya başlamadan önce sağlamak bizim açımızdan önem taşıyor.

  1. Node.js 16 veya daha yeni bir sürümü yükleyin. Düğümü yüklemenin bir yolu da nvm (veya nvm-windows) oluşturun.

  2. Firebase CLI'ı yükleyin veya en son sürümüne güncelleyin. Alıcı: npm kullanarak yüklemek veya güncellemek için şu komutu çalıştırın:

    npm install -g firebase-tools
    

Şimdi yeni bir uzantı projesini başlatmak için Firebase CLI'ı kullanın:

  1. Uzantınız için bir dizin oluşturun ve bu dizin içine cd ekleyin:

    mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
    
  2. Firebase CLI'ın ext:dev:init komutunu çalıştırın:

    firebase ext:dev:init
    

    İstendiğinde, işlevler için dil olarak JavaScript'i seçin (ancak şunu unutmayın: (TypeScript'i kendi uzantınızı geliştirirken de kullanabilirsiniz) ve Bağımlılıkları yüklemeniz istendiğinde "evet" yanıtını verin. (Şunun için varsayılanları kabul edin: başka seçenekler de kullanabilirsiniz.) Bu komut, komut dosyası için iskelet kod tabanı oluşturmaya başlayabileceğiniz yeni bir uzantıdır.

2. Emülatörü kullanarak örnek uzantıyı deneyin

Firebase CLI, yeni uzantı dizinini başlattığında basit örnek fonksiyonu ve şunu içeren bir integration-tests dizini: bir uzantıyı çalıştırmak için gereken dosyaları içerir.

Emülatörde örnek uzantıyı çalıştırmayı deneyin:

  1. integration-tests dizinine geçin:

    cd functions/integration-tests
    
  2. Emülatörü bir demo projeyle başlatın:

    firebase emulators:start --project=demo-test
    

    Emülatör, uzantıyı önceden tanımlanmış bir "sahte" içine yükler proje (demo-test). Şu ana kadar uzantı, tek bir HTTP tetiklenmiş "hello world" değerini döndüren greetTheWorld işlevi mesaj gönder: erişilebilir.

  3. Emülatör hâlâ çalışıyorken uzantının greetTheWorld komutunu deneyin işlevini başlatarak yazdırdığı URL'yi ziyaret edebilirsiniz.

    Tarayıcınızda "Hello World from selet-the-world" mesajı gösterilir.

  4. Bu işlevin kaynak kodu, uzantının functions içindedir dizin. Kaynağı seçtiğiniz düzenleyicide veya IDE'de açın:

    fonksiyonlar/index.js

    const functions = require("firebase-functions");
    
    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. Emülatör çalışırken, yaptığınız değişiklikleri otomatik olarak kolayca uygulayabilirsiniz. Belgenizde küçük bir değişiklik yapmayı deneyin: greetTheWorld işlevi:

    fonksiyonlar/index.js

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

    Yaptığınız değişiklikleri kaydedin. Emülatör kodunuzu yeniden yükler. Şimdi, işlev URL'sini ziyaret ettiğinizde güncellenmiş karşılama mesajını görürsünüz.

3. extensions.yaml dosyasına temel bilgileri ekleyin

Artık kurduğunuz bir geliştirme ortamı olduğuna ve uzantıları emülatörü kullanıyorsanız kendi uzantınızı yazmaya başlayabilirsiniz.

Mütevazı bir ilk adım olarak, önceden tanımlanmış uzantı meta verilerini greet-the-world yerine yazmak istediğiniz uzantı var. Bu meta veri extension.yaml dosyasında depolanır.

  1. Düzenleyicinizde extension.yaml dosyasını açın ve dosyası oluşturun:

    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 alanında kullanılan adlandırma kuralına dikkat edin: Resmi Firebase Uzantılar, birincil Firebase ürününü belirten bir ön ekle adlandırılır Önce uzantının ne üzerinde çalıştığı ve ardından uzantının yapıyor. Aynı kuralı kendi uzantılarınızda da kullanmalısınız.

  2. Uzantınızın adını değiştirdiğiniz için emülatör yapılandırması:

    1. functions/integration-tests/firebase.json içinde greet-the-world değerini değiştirin alıcı: rtdb-uppercase-messages.
    2. functions/integration-tests/extensions/greet-the-world.env adlı cihazın adını şu şekilde değiştir: functions/integration-tests/extensions/rtdb-uppercase-messages.env.

greet-the-world uzantının bazı kalıntıları hâlâ var: ama şimdilik bunlarda kalsın. Önümüzdeki birkaç gün içinde bu ayarları güncelleyeceksiniz bölümlerini kontrol edin.

4. Cloud Functions işlevi yazma ve bunu uzantı kaynağı olarak tanımlama

Artık kod yazmaya başlayabilirsiniz. Bu adımda bir Cloud Uzantınızın temel görevini yerine getiren mesajları için Realtime Database'inizi izleyin ve bunları büyük harfe dönüştürün.

  1. Uzantının işlevlerine ait kaynağı açın (uzantının functions dizini) kullanabilirsiniz. Değiştir şu içeriğe sahip:

    fonksiyonlar/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);
    });
    

    Değiştirdiğiniz eski işlev, HTTP tetiklenmiş bir işlevdi. bir HTTP uç noktasına erişildiğinde çalıştırıldı. Yeni işlev, gerçek zamanlı veritabanı etkinlikleri: belirli bir yoldaki yeni öğeleri izler algılanırsa değerin büyük harfli sürümünü geri yazar ekler.

    Bu arada, bu yeni dosyada ECMAScript modülü söz dizimi (import ve export) içerir.require Düğüm'de ES modüllerini kullanmak için: functions/package.json içinde "type": "module" belirtin:

    {
      "name": "rtdb-uppercase-messages",
      "main": "index.js",
      "type": "module",
      …
    }
    
  2. Uzantınızdaki her işlev, extension.yaml içinde tanımlanmalıdır dosyası olarak kaydedebilirsiniz. Örnek uzantı, greetTheWorld öğesini uzantının tek Cloud Functions işlevi bunu makeuppercase ile değiştirdiğinize göre beyanını güncellemeniz gerekiyor.

    extension.yaml sayfasını açın ve bir resources alanı ekleyin:

    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. Uzantınız artık tetikleyici olarak Realtime Database kullandığından emülatör yapılandırmanızı güncelleyerek Cloud Functions emülatörü:

    1. Emülatör hâlâ çalışıyorsa Ctrl-C tuşlarına basarak durdurun.

    2. functions/integration-tests dizininden aşağıdaki komutu çalıştırın komut:

      firebase init emulators
      

      Sorulduğunda, varsayılan proje oluşturmayı atlayın, ardından İşlevleri seçin ve Veritabanı emülatörleri. Varsayılan bağlantı noktalarını kabul edin ve kuruluma izin verin aracını kullanın.

    3. Emülatörü yeniden başlatın:

      firebase emulators:start --project=demo-test
      
  4. Güncellenen uzantınızı deneyin:

    1. Yazdırılan emülatörün bağlantısını kullanarak Database emülatör kullanıcı arayüzünü açın. bazı bilgiler verelim.

    2. Veritabanının kök düğümünü düzenleyin:

      • Alan: messages
      • Tür: json
      • Değer: {"11": {"original": "recipe"}}

      Her şey doğru şekilde ayarlanmışsa veritabanı değişikliklerinizi kaydettiğinizde uzantının makeuppercase işlevi tetiklenmeli ve bir alt öğe eklemelidir "upper": "RECIPE" içeriğini içeren mesaj 11'e kaydı. Bir göz atın emülatör kullanıcı arayüzünün günlüklerde ve veritabanı sekmelerinde beklenen sonuçlar.

    3. messages düğümüne birkaç alt öğe daha eklemeyi deneyin ({"original":"any text"}). Her yeni kayıt eklediğinizde uzantısı, büyük harfli uppercase alanı eklemelidir original alanının içeriği.

Artık RTDB üzerinde çalışan eksiksiz ancak basit bir uzantınız var kullanır. Sonraki bölümlerde, bu uzantıyı sunuyor. Ardından uzantıyı ve son olarak uzantılarınızı Extensions Hub'da nasıl yayınlayacağınızı öğrenin.

5. API'leri ve rolleri tanımlama

Firebase, yüklü bir uzantının her bir örneğine proje ve verilerini kullanır. Her hesapta izin sayısını artırmak için tamamlanması zor olmalıdır. Bu nedenle, Uzantınızın gerektirdiği tüm IAM rollerini açıkça bildirin; Kullanıcılar yüklediğinde uzantınızı ayarladığınızda, Firebase bu rollerin verildiği bir hizmet hesabı oluşturur ve uzantıyı çalıştırmak için bunu kullanır.

Bir ürünün etkinliklerini tetiklemek için rolleri tanımlamanız gerekmez, ancak etkileşimde bulunabilmek için bir rol beyan etmesi gerekir. Çünkü kullandığınız fonksiyon Realtime Database'e yazma aşamasında olduğundan, extension.yaml adresine aşağıdaki beyan:

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

Benzer şekilde, uzantıların kullandığı Google API'lerini apis içinde açıklarsınız. girin. Kullanıcılar uzantınızı yüklediklerinde, uygulamanızı yüklemek isteyip istemedikleri sorulur. projelerinde bu API'leri otomatik olarak etkinleştirmelerini isteyebilir. Bu genellikle yalnızca Firebase dışı Google API'leri için gereklidir ve bu kılavuzda gerekli değildir.

6. Kullanıcı tarafından yapılandırılabilen parametreleri tanımlayın

Son iki adımda oluşturduğunuz işlev, belirli bir RTDB konumunu izledi seçeneğini tıklayın. Bazen, belirli bir konumu izlemek, Örneğin, uzantınızın istediğiniz bir veritabanı yapısında çalıştığında Yalnızca uzantınız için kullanın. Ancak çoğu zaman bu değerleri, uzantılarınızı bilgi edinmenizi sağlar. Böylece, kullanıcılar uzantınızı kullanarak Mevcut veritabanı kurulumu.

Uzantının yeni mesajlar için izlediği yolu kullanıcı tarafından yapılandırılabilir hale getirin:

  1. extension.yaml dosyasına bir params bölümü ekleyin:

    - 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
    

    Bu, uzantıyı yüklemelerine yardımcı olur.

  2. extension.yaml dosyasındayken makeuppercase dosyanıza geri dönün beyanını ekleyin ve resource alanını aşağıdaki şekilde değiştirin:

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

    ${param:MESSAGE_PATH} jetonu, az önce oluşturduğunuz parametreye referanstır tanımlanmıştır. Uzantınız çalıştığında bu jetonun yerini kullanıcının söz konusu parametre için yapılandırdığı değere sahiptir. Bunun sonucunda makeuppercase işlevi, kullanıcının belirttiği yolu dinler. Şunları yapabilirsiniz: extension.yaml (ve POSTINSTALL.md içinde bunun hakkında daha fazla bilgi bulabilirsiniz).

  3. Kullanıcı tanımlı parametrelere işlev kodunuzdan da erişebilirsiniz.

    Son bölümde yazdığınız fonksiyonda, görebilirsiniz. Şuna referans verecek şekilde tetikleyici tanımını değiştirin: kullanıcı tanımlı bir değer kullanın:

    fonksiyonlar/index.js

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

    Firebase Extensions'da bu değişikliğin sadece belgeler: Bir Cloud Functions işlevi, bir uzantının parçası olarak dağıtıldığında extension.yaml dosyasındaki tetikleyici tanımını kullanır ve işlev tanımında belirtilen değer. Yine de iletişim kurmak için bu değerin nereden geldiğini kodunuzda belgeleyin.

  4. Çalışma zamanı olmayan bir kod değişikliği yapmak sizi hayal kırıklığına uğratabilir. ancak bundan çıkarmamız gereken önemli ders şu: kullanıcı tanımlı parametreyi kullanabilir ve bu parametreyi normal bir değer olarak kullanabilirsiniz. fonksiyonunun mantığında yer alır. Bu özelliği hatırlatmak için aşağıdaki günlüğü ekleyin Bu ifade, sizin için faydalı olan değere eriştiğinizi, kullanıcı tanımlı:

    fonksiyonlar/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. Normalde, rastgele bir yapılandırma oluşturduklarında kullanıcılardan parametreler için değer bir uzantı yükleyebilirsiniz. Test ve geliştirme için emülatörü kullandığınızda ancak yükleme işlemini atlarsınız ve onun yerine kullanıcı tanımlı parametreler için env dosyası kullanın.

    functions/integration-tests/extensions/rtdb-uppercase-messages.env uygulamasını aç ve GREETING tanımını aşağıdakiyle değiştirin:

    MESSAGE_PATH=/msgs/{pushId}/original
    

    Yukarıdaki yolun, varsayılan yoldan ve daha önce tanımladığınız yol; Bunu kendinize ve tanımlamanızı öneririz.

  6. Şimdi emülatörü yeniden başlatın ve veritabanı emülatörü kullanıcı arayüzünü tekrar ziyaret edin.

    Yukarıda tanımladığınız yolu kullanarak veritabanının kök düğümünü düzenleyin:

    • Alan: msgs
    • Tür: json
    • Değer: {"11": {"original": "recipe"}}

    Veritabanı değişikliklerinizi kaydettiğinizde uzantının makeuppercase fonksiyonunun önceden olduğu gibi tetiklenmesi gerekir, ancak şimdi kullanıcı tanımlı parametreyi içerebilir.

7. Kullanıcı tanımlı mantık için etkinlik kancaları sağlama

Uzantı yazarı olarak, Firebase ürününün, uzantının sağladığı mantık: Realtime Database'de yeni kayıtların oluşturulması makeuppercase işlevinizi tetikler. Uzantınız, olan, uzantıyı yükleyen kullanıcılarla ilişki kurmaktır: uzantınız kullanıcının tanımladığı tetikleyici mantığını kullanın.

Uzantı, eşzamanlı kancalar, eşzamansız kancalar veya her ikisini de sağlayabilir. Eşzamanlı kancalar, kullanıcılara tamamlanmalarını engelleyen görevleri yerine getirmelerini uzantının işlevlerinden biri. Bu, örneğin kullanıcılara bir uzantı çalışmadan önce özel ön işlemenin bir yolunu sunar.

Bu kılavuzda, uzantınıza eşzamansız bir kanca ekleyerek kullanıcıların, uzantınızdan sonra çalıştırılacak kendi işleme adımlarını tanımlamalarını sağlar. büyük harfli mesajı Realtime Database'e yazar. Eşzamansız kanca kullanımı Tetiklemek için Eventarc kullanıcı tanımlı işlevler. Uzantılar, yayınladıkları etkinlik türlerini bildirir ve Kullanıcılar uzantıyı yüklediklerinde emin olabilirsiniz. Kullanıcılar en az bir etkinlik seçerse Firebase, kullanıcıları Uzantının, yükleme işleminin bir parçası olarak Eventarc kanalı. Kullanıcı Sayısı o kanaldaki içerikleri izleyen kendi Cloud Functions işlevlerini dağıtabilir ve Uzantı yeni etkinlikler yayınladığında tetiklenir.

Eşzamansız kanca eklemek için şu adımları izleyin:

  1. extension.yaml dosyasına uzantının yayınladığı bir etkinlik türü:

    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.
    

    Etkinlik türleri evrensel olarak benzersiz olmalıdır; benzersiz olması için her zaman şu biçimi kullanarak etkinliklerinizi: <publisher-id>.<extension-id>.<version>.<description> ( yayıncı kimliğini henüz doğrulamadıysanız, şimdilik yalnızca test-publisher kullanın.)

  2. makeuppercase işlevinin sonuna, bir etkinliğinden birini seçin:

    fonksiyonlar/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,
        },
      });
    

    Bu örnek kod, EVENTARC_CHANNEL öğesinin ortam değişkeni yalnızca kullanıcı en az bir ortam değişkeni etkinleştirdiğinde etkinlik türü. EVENTARC_CHANNEL tanımlanmamışsa kod tıklayın.

    Bir Eventarc etkinliğine daha fazla bilgi ekleyebilirsiniz. Yukarıdaki örnekte, bu etkinlikte,subject ve orijinal ile birlikte oluşturulan bir data yükünü içeren büyük harfle yazılmış mesajlar. Etkinliği tetikleyen kullanıcı tanımlı işlevler uygun şekilde düzenlemelisiniz.

  3. Normalde, EVENTARC_CHANNEL ve EXT_SELECTED_EVENTS ortamı değişkenler, kullanıcının dönüşüm sırasında belirlediği seçeneklere göre teşekkür ederiz. Emülatörle test yapmak için bu değişkenleri manuel olarak tanımlayın rtdb-uppercase-messages.env dosyasında:

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

Bu noktada, eşzamansız etkinlik eklemek için gereken adımları tamamladınız ilgi çekici hale getirin.

Az önce uyguladığınız bu yeni özelliği denemek için adımlarında, uzantıyı yükleyen bir kullanıcının rolünü üstlenin:

  1. functions/integration-tests dizininden yeni bir Firebase başlatın proje:

    firebase init functions
    

    İstendiğinde, varsayılan proje oluşturmayı reddetmeyin, Cloud Functions'ın dilini ve gerekli bağımlılıkları yükleyin. Bu projesi, uzantınızın yüklü olduğu bir kullanıcı projesini temsil eder.

  2. integration-tests/functions/index.js dosyasını düzenleyin ve aşağıdaki kodu yapıştırın:

    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}!!!`);
      }
    );
    

    Bu, kullanıcının yazabileceği bir işleme sonrası işlevi örneğidir. Burada bu durumda işlev, uzantıyı dinleyerek bir complete etkinliği yayınlar. tetiklendiğinde, yeni başlayanlara üç ünlem işareti ekler. mesajını alırsınız.

  3. Emülatörü yeniden başlatın. Emülatör, uzantının işlevlerini "user" ise işleme sonrası tanımlanmıştır.

  4. Veritabanı emülatörü kullanıcı arayüzünü ziyaret edin ve yukarıda tanımladığınız yol:

    • Alan:msgs
    • Tür: json
    • Değer: {"11": {"original": "recipe"}}

    Veritabanı değişikliklerinizi kaydettiğinizde uzantının makeuppercase işlevi ve kullanıcının extraemphasis işlevi sırayla tetiklenmelidir. Bunun sonucunda, upper alanı RECIPE!!! değerini alır.

8. Yaşam döngüsü etkinlik işleyicileri ekleyin

Şu ana kadar yazdığınız uzantı, mesajları oluşturuldukları anda işler. Ama Kullanıcılarınız Gmail'i yüklediğinde bir ileti veritabanına sahipse ne olur? uzantısı nedir? Firebase Extensions, yaşam döngüsü olay kancaları adlı bir özelliğe sahiptir. Uzantınız yüklendiğinde, güncellendiğinde veya yeniden yapılandırıldı. Bu bölümde, yaşam döngüsü etkinlik kancalarını kullanarak projenin mevcut mesaj veritabanını kullanır. Bir kullanıcı uzantınızı yükler.

Firebase Extensions, yaşam döngüsü etkinlik işleyicilerinizi çalıştırmak için Cloud Tasks'ı kullanır. Siz Cloud Functions'ı kullanarak etkinlik işleyiciler tanımlayabilirsiniz. örneğinizin her zaman bir veya daha fazla dönüşüm elde etmek için desteklenen yaşam döngüsü olaylarından birine işleyiciyi bir Cloud Tasks sırasına ekler. Cloud Tasks bu durumda işleyiciyi eşzamansız olarak çalıştırabilir. Bir yaşam döngüsü etkinlik işleyicisi çalışırken Firebase konsolu kullanıcıya, uzantı örneğinin mevcut bir devam ediyor. Devam eden işlemleri bildirmek için işleyici işlevinize bağlıdır kullanıcıya göstermeden önce değerlendirmelisiniz.

Mevcut mesajları dolduran bir yaşam döngüsü etkinlik işleyicisi eklemek için şunu yapın: takip etmek için:

  1. Görev sırası etkinlikleri tarafından tetiklenen yeni bir Cloud Functions işlevi tanımlayın:

    fonksiyonlar/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.");
      }
    });
    

    İşlevin kendini eklemeden önce yalnızca birkaç kayıt işlediğine dikkat edin. görev sırasına alınır. Bu strateji, proje yöneticilerinin bir Cloud'un zaman aşımı aralığında tamamlanamayan görevleri işleme işlev. Bir kullanıcının önceden kaç ileti gönderebileceğini ve veri tabanında tutmak yerine, uzantıyı yüklediklerinde uygun.

  2. extension.yaml dosyasında, dolgu işlevinizi uzantı olarak bildirin taskQueueTrigger özelliğine sahip kaynak:

    resources:
      - name: makeuppercase
        ...
      - name: backfilldata
        type: firebaseextensions.v1beta.function
        description: >-
          Backfill existing messages with uppercase versions
        properties:
          runtime: "nodejs18"
          taskQueueTrigger: {}
    

    Ardından, işlevi onInstall yaşam döngüsü için işleyici olarak tanımlayın etkinlik:

    lifecycleEvents:
      onInstall:
        function: backfilldata
        processingMessage: Uppercasing existing messages
    
  3. Mevcut mesajların tekrar doldurulması güzel olsa da olmadan da çalışmaya devam etmesini sağlar. Bu gibi durumlarda makyaj sırasında yaşam döngüsü etkinlik işleyicileri isteğe bağlıdır.

    Bunu yapmak için extension.yaml öğesine yeni bir parametre ekleyin:

    - 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
    

    Ardından dolgu işlevinin başında, DO_BACKFILL parametresini kullanın ve ayarlanmazsa erkenden çıkın:

    fonksiyonlar/index.js

    if (!process.env.DO_BACKFILL) {
      return getExtensions()
        .runtime()
        .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped.");
    }
    

Yukarıdaki değişikliklerle birlikte, uzantı artık mevcut mesajları büyük harfle yazılır.

Bu noktaya kadar uzantınızı geliştirmek için uzantı emülatörünü kullandınız. ve sürekli değişiklikleri test etmektir. Ancak uzantı emülatörü, yükleme işlemini atlar işlemi gerçekleştirebilir. Bu nedenle, onInstall etkinlik işleyicinizi test etmek için bir uzantıya sahip olacaksınız. Ama bu iyi, çünkü yeni metin ve eğitim uzantısı artık kodla tamamlandı.

9. Gerçek bir Firebase projesine dağıtın

Uzantılar emülatörü, bir uzantıda hızla yineleme yapmak için sırasında uzantıları kullanmayı deniyorsanız, bir noktada bunu gerçekten belirler.

Bunu yapmak için önce bazı hizmetlerin etkin olduğu yeni bir proje oluşturun:

  1. Firebase konsolunda yeni bir belirler.
  2. Projenizi yükseltme kullanmaya başlayın. Cloud Functions for Firebase için projenin faturalandırma hesabı olabilir; dolayısıyla, bir uzantı yükleyebilirsiniz.
  3. Yeni projenizde Real-time Database'i etkinleştirin.
  4. Uzantınızın mevcut verileri doldurma özelliğini test etmek için kurulumu sırasında birkaç örnek veriyi gerçek zamanlı veritabanı örneğinize aktarın:
    1. Bazı çekirdek RTDB verileri indirin.
    2. Firebase konsolunun Real-time Database sayfasında (diğer) > JSON'u içe aktarın ve az önce indirdiğiniz dosyayı seçin.
  5. Dolgu işlevini orderByChild yöntemini kullanacak şekilde etkinleştirmek için şunları yapılandırın: aşağıdaki veritabanını kullanarak upper değerindeki iletileri dizine ekleyin:

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

Şimdi, uzantınızı yerel kaynaktan yeni projeye yükleyin:

  1. Firebase projeniz için yeni bir dizin oluşturun:

    mkdir ~/extensions-live-test && cd ~/extensions-live-test
    
  2. Çalışma dizininde bir Firebase projesini başlatın:

    firebase init database
    

    İstendiğinde yeni oluşturduğunuz projeyi seçin.

  3. Uzantıyı yerel Firebase projenize yükleyin:

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

    Burada, aşağıdaki gibi bir şema yüklemek için kullanıcı deneyiminin Firebase CLI aracını kullanabilirsiniz. "Evet"i seçtiğinizden emin olun yapılandırma aracı mevcut veritabanınızı doldurmak isteyip istemediğinizi sorar.

    Yapılandırma seçeneklerini belirlemenizin ardından Firebase CLI, verilerinizi yapılandırmasını extensions dizininize ekleyin ve uzantı kaynağını kaydedin konumu.firebase.json Bu iki kayıt, toplu olarak uzantılar manifesti olarak adlandırılır. Kullanıcılar, verilerini kaydetmek için manifest'i uzantıları yapılandırmanızı ve farklı projelere dağıtmanızı sağlar.

  4. Uzantı yapılandırmanızı yayındaki projenize dağıtın:

    firebase deploy --only extensions
    

Her şey yolunda giderse Firebase CLI, uzantınızı projenize yüklemelidir yükleyin. Yükleme tamamlandıktan sonra dolgu görevi çalıştırılır ve birkaç dakika içinde veritabanınız büyük harfli iletilerle güncellenecektir. Birkaç tane ekle yeni düğümler ekleyin ve uzantının da çalıştığından emin olun. yeni mesajlar için e-posta gönderin.

10. Belge yazma

Uzantınızı kullanıcılarla paylaşmadan önce, yeterli düzeyde uzantı sağladığınızdan emin olun. gerekli belgeleri hazırlar.

Uzantı projesini başlattığınızda Firebase CLI, saplama oluşturdu ve gerekli minimum belgelerin tam sürümleri. Bu dosyaları doğru şekilde güncelleyin ve oluşturduğunuz uzantıyı yansıtmalıdır.

uzantı.yaml

Bu uzantıyı geliştirdiğiniz için dosyayı zaten güncelliyorsunuz. şu anda başka güncelleme yapmanız gerekmiyor.

Bununla birlikte, bu belgede yer alan belgelerin önemini de göz ardı etmeyin. dosyası olarak kaydedebilirsiniz. Uzantının önemli tanımlayıcı bilgilerine ek olarak, açıklama, yazar, resmi depo konumu—extension.yaml dosyası, her kaynak ve kullanıcı tarafından yapılandırılabilen her kaynak için kullanıcılara yönelik belgeler içerir. parametresinden sonra bir değer girin. Bu bilgiler Firebase konsolunda kullanıcılara gösterilir. Extensions Hub ve Firebase CLI arasında geçiş yapın.

PREINSTALL.md

Bu dosyada, kullanıcıların uygulamanızı yüklemeden önce ihtiyaç duydukları bilgileri uzantı: uzantının ne yaptığını kısaca açıklayın, ön koşulları açıklayın, ve kullanıcıya bu tür yüklemelerin faturalandırmayla ilgili sonuçları hakkında bilgi vermek uzantısına sahip olur. Ek bilgiler içeren bir web siteniz varsa bu da iyi bir yer hâline getiriyorsunuz.

Bu dosyanın metni, kullanıcıya Extensions Hub'da ve firebase ext:info komutudur.

Aşağıda bir ÖN YÜKLEME dosyası örneği verilmiştir:

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

Bu dosya, başarılı bir şekilde geçiş yapan kullanıcılar için yararlı bilgiler içerir yükleyin: Örneğin, izleme kurulumu adımları, yeni bir ve bu şekilde devam eder.

POSTINSTALL.md dosyasının içeriği, komut yüklendikten sonra Firebase konsolunda uzantısı yapılandırılıp yüklendi. Bu dosyası oluşturur. Bu dosyalar, yapılandırılmış değerlerle değiştirilir.

Aşağıda, eğitim uzantısı için örnek bir yükleme sonrası dosya örneği verilmiştir:

### 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

Bir uzantının sürümleri arasında yaptığınız değişiklikleri de belgelemelisiniz. CHANGELOG.md dosyasında bulabilirsiniz.

Örnek uzantı daha önce hiç yayınlanmadığı için, değişiklik günlüğü tek bir giriş var:

## Version 0.0.1

Initial release of the _Convert messages to upper case_ extension.

BENİOKU.md

Çoğu uzantı, sayfayı ziyaret eden kullanıcıların yararına bir benioku dosyası da sağlar. uzantının deposudur. bu dosyayı elle yazabilir ya da beni oku oluşturabilirsin komutunu kullanabilirsiniz.

Bu kılavuzu kullanmak için, Benioku dosyası yazma adımını atlayın.

Ek belgeler

Yukarıda ele alınan dokümanlar, ihtiyacınız olan minimum belge grubudur sağlar. Birçok uzantı, kullanıcıların nasıl kullanacağınızı göstereceğim. Böyle bir durumda, dokümanları barındırın ve kullanıcıları yönlendirebileceğiniz bir yerde barındırın.

Bu kılavuzun amacı gereği, daha kapsamlı belgeler yazmayı atlayın.

11. Uzantı Merkezi'nde yayınla

Uzantınız kod tamamlandığına ve belgelendiğine göre artık tüm dünyayla paylaşabilirsiniz. Ancak, bu yalnızca bir eğitim olduğundan yardımcı olamam. Yüklediğiniz öğeleri kullanarak kendi uzantınızı yazmaya başlayın Firebase Extensions yayıncı belgelerinin diğer kısımlarında öğrendik. ve Firebase tarafından yazılan resmi uzantıların kaynağını inceleyerek.

Çalışmanızı Extensions Hub'da yayınlamaya hazır olduğunuzda nasıl yapacağınız aşağıda açıklanmıştır şunları sağlar:

  1. İlk uzantınızı yayınlıyorsanız uzantı yayıncısı olarak kaydolmalıdır. Zaman bir uzantı yayıncısı olarak kaydediyorsanız Kullanıcıların sizi kısa süre içinde uzantılarınızın yazarı olarak tanımlamasını sağlar.
  2. Uzantınızın kaynak kodunu herkes tarafından doğrulanabilecek bir konumda barındırın. Zaman kodunuzun doğrulanabilir bir kaynaktan alındığında, Firebase sizin uzantısını doğrudan bu yerden indirin. Bu sayede projede uzantınızın şu anda yayınlanan sürümünü yayınlamanıza yardımcı olur ve kendi projelerine yükledikleri kodu incelemelerini sağlayabilir.

    Şu anda bunun için uzantınızın herkese açık bir GitHub'da kullanıma sunulması gerekiyor depodur.

  3. firebase ext:dev:upload kullanarak uzantınızı Uzantı Merkezi'ne yükleyin komutunu kullanın.

  4. Firebase konsolunda yayıncı kontrol panelinize gidin ve uzantıyı bulun yükleyin ve "Uzantılar Merkezi'nde Yayınla"yı tıklayın. Bu durumda birkaç gün sürebilir. Onaylandığı takdirde uzantı, Extensions Hub'da yayınlanacak. Reddedilirse size bir nedeni açıklayan mesaj Böylece bildirilen sorunları giderebilir tekrar incelemeye gönderin.