Bu sayfada, projenize yükleyebileceğiniz veya başkalarıyla paylaşabileceğiniz basit bir Firebase uzantısı oluşturmak için gereken adımlarda size yol gösterilmektedir. Bu basit Firebase uzantısı örneği, Realtime Database'nizde mesajları izler ve bunları büyük harfe dönüştürür.
1. Ortamınızı ayarlama ve projeyi ilk kullanıma hazırlama
Uzantı oluşturmaya başlamadan önce gerekli araçlarla bir derleme ortamı oluşturmanız gerekir.
Node.js 16 veya daha yeni bir sürümü yükleyin. Düğümü yüklemenin bir yolu nvm (veya nvm-windows) kullanmaktır.
Firebase CLI'yi yükleyin veya en son sürümüne güncelleyin.
npm
kullanarak yüklemek veya güncellemek için şu komutu çalıştırın:npm install -g firebase-tools
Ardından, yeni bir uzantı projesini başlatmak için Firebase CLI'yi kullanın:
Uzantınız için bir dizin oluşturun ve bu dizin içine
cd
ekleyin:mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
Firebase CLI'nin
ext:dev:init
komutunu çalıştırın:firebase ext:dev:init
İstendiğinde, işlevler için JavaScript'i seçin (ancak kendi uzantınızı geliştirirken TypeScript'i de kullanabileceğinizi unutmayın) ve bağımlılıkların yüklenmesi istendiğinde "evet" yanıtını verin. (Diğer seçenekler için varsayılan değerleri kabul edin.) Bu komut, yeni bir uzantı için iskelet kod tabanı oluşturur. Bu kod tabanını kullanarak uzantınızı geliştirmeye başlayabilirsiniz.
2. Emülatör kullanarak örnek uzantıyı deneme
Firebase CLI, yeni uzantılar dizini başlattığında basit bir örnek işlev ve Firebase emülatör paketini kullanarak bir uzantıyı çalıştırmak için gerekli dosyaları içeren bir integration-tests
dizini oluşturdu.
Örnek uzantıyı emülatörde çalıştırmayı deneyin:
integration-tests
dizinine geçin:cd functions/integration-tests
Emülatörü bir demo projeyle başlatın:
firebase emulators:start --project=demo-test
Emülatör, uzantıyı önceden tanımlanmış "sahte" bir projeye (
demo-test
) yükler. Şu ana kadarki uzantı, şimdiye kadarki HTTP tetiklenmiş tek bir işlevden (greetTheWorld
) oluşmaktadır. Bu işlev, erişildiğinde bir "hello world" mesajı döndürmektedir.Emülatör hâlâ çalışırken, uzantıyı başlattığınızda yazdırdığı URL'yi ziyaret ederek
greetTheWorld
işlevini deneyin.Tarayıcınızda "Hello World from selet-the-world" mesajı gösterilir.
Bu işlevin kaynak kodu, uzantının
functions
dizinindedir. Kaynağı, tercih ettiğiniz düzenleyicide veya IDE'de açın: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); });
Emülatör çalışırken Functions kodunuzda yaptığınız tüm değişiklikleri otomatik olarak yeniden yükler.
greetTheWorld
işlevinde küçük bir değişiklik yapmayı deneyin:fonksiyonlar/index.js
const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;
Yaptığınız değişiklikleri kaydedin. Emülatör, kodunuzu yeniden yükler. Artık 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
Geliştirme ortamınızı oluşturdunuz ve uzantı emülatörünü çalıştırıyorsunuz. Artık kendi uzantınızı yazmaya başlayabilirsiniz.
İlk adım olarak, önceden tanımlanmış uzantı meta verilerini greet-the-world
yerine yazmak istediğiniz uzantıyı yansıtacak şekilde düzenleyin. Bu meta veriler extension.yaml
dosyasında depolanır.
Düzenleyicinizde
extension.yaml
dosyasını açın ve dosyanın tüm içeriğini aşağıdakiyle değiştirin: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ı, uzantının çalıştığı birincil Firebase ürününü belirten bir ön ek ve ardından uzantının ne yaptığının açıklamasıyla adlandırılır. Kendi uzantılarınızda da aynı kuralı kullanmalısınız.Uzantı adınızı değiştirdiğiniz için emülatör yapılandırmanızı da yeni adla güncellemeniz gerekir:
functions/integration-tests/firebase.json
dosyasındagreet-the-world
değerinirtdb-uppercase-messages
olarak değiştirin.functions/integration-tests/extensions/greet-the-world.env
'üfunctions/integration-tests/extensions/rtdb-uppercase-messages.env
olarak yeniden adlandırın.
Uzantı kodunuzda greet-the-world
uzantısının bazı kalıntıları var ancak şimdilik bunları kaldırmayın. Bunları sonraki birkaç bölümde
güncelleyeceksiniz.
4. Cloud Functions işlevi yazın ve uzantı kaynağı olarak tanımlayın
Artık kod yazmaya başlayabilirsiniz. Bu adımda, uzantınızın temel görevini (Realtime Database'de mesajları izlemek ve bunları büyük harfe dönüştürmek) gerçekleştiren bir Cloud Function yazacaksınız.
Uzantının işlevlerine ait kaynağı (uzantının
functions
dizininde) istediğiniz düzenleyicide veya IDE'de açın. İçeriğini aşağıdakiyle değiştirin: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); });
Değiştirdiğiniz eski işlev, bir HTTP uç noktasına erişildiğinde çalışan HTTP tetiklenmiş bir işlevdi. Yeni işlev, gerçek zamanlı veritabanı etkinlikleri tarafından tetiklenir: Belirli bir yolda yeni öğeler izler ve bir öğe algılandığında değerin büyük harfli sürümünü veritabanına geri yazar.
Bu arada, bu yeni dosyada CommonJS (
require
) yerine ECMAScript modülü söz dizimi (import
veexport
) kullanılmaktadır. Node'da ES modüllerini kullanmak içinfunctions/package.json
içinde"type": "module"
değerini belirtin:{ "name": "rtdb-uppercase-messages", "main": "index.js", "type": "module", … }
Genişletmenizdeki her işlev,
extension.yaml
dosyasında tanımlanmalıdır. Örnek uzantı, uzantının tek Cloud işlevi olarakgreetTheWorld
'ü tanımladı. ArtıkgreetTheWorld
ile değiştirdiğiniz bu işlevin tanımını da güncellemeniz gerekiyor.makeuppercase
extension.yaml
sayfasını açın ve birresources
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"
Uzantı artık tetikleyici olarak Realtime Database kullandığından, emülatör yapılandırmanızı Cloud Functions emülatörünün yanı sıra RTDB emülatörünü de çalıştıracak şekilde güncellemeniz gerekir:
Emülatör hâlâ çalışıyorsa Ctrl-C tuşlarına basarak durdurun.
functions/integration-tests
dizininden aşağıdaki komutu çalıştırın:firebase init emulators
İstendiğinde varsayılan proje oluşturma adımını atlayıp Functions ve veritabanı emülatörlerini seçin. Varsayılan bağlantı noktalarını kabul edin ve kurulum aracının gerekli dosyaları indirmesine izin verin.
Emülatörü yeniden başlatın:
firebase emulators:start --project=demo-test
Güncellenen uzantınızı deneyin:
Emülatörü başlattığınızda yazdırılan bağlantıyı kullanarak veritabanı emülatör kullanıcı arayüzünü açın.
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"upper": "RECIPE"
içeriğini içeren mesaj 11'e bir alt kayıt eklemelidir. Beklenen sonuçları doğrulamak için emülatör kullanıcı arayüzünün günlüklerine ve veritabanı sekmelerine göz atın.- Alan:
messages
düğümüne ({"original":"any text"}
) daha fazla alt öğe eklemeyi deneyin. Yeni bir kayıt eklediğinizde uzantı,original
alanının büyük harfli içeriğini içeren biruppercase
alanı ekler.
Artık bir RTDB örneğinde çalışan basit ancak eksiksiz bir uzantınız var. Sonraki bölümlerde, bu uzantıyı bazı ek özelliklerle hassaslaştıracaksınız. Ardından, uzantıyı başkalarına dağıtmaya hazır hale getirir ve son olarak uzantınızı Uzantıları Merkezi'nde nasıl yayınlayacağınızı öğrenirsiniz.
5. API'leri ve rolleri tanımlama
Firebase, örnek başına bir hizmet hesabı kullanarak yüklenen bir uzantının her örneğine projeye ve verilerine sınırlı erişim izni verir. Her hesap, çalışması için gereken minimum izin grubuna sahiptir. Bu nedenle, uzantınızın gerektirdiği IAM rollerini açıkça belirtmeniz gerekir. Kullanıcılar uzantınızı yüklediğinde Firebase, bu rollerin verildiği bir hizmet hesabı oluşturur ve uzantıyı çalıştırmak için bu hesabı kullanır.
Bir ürünün etkinliklerini tetiklemek için rol belirtmeniz gerekmez ancak ürünle başka bir şekilde etkileşim kurmak için rol belirtmeniz gerekir. Son adımda eklediğiniz işlev Realtime Database'e yazdığı için extension.yaml
değişkenine aşağıdaki beyanı eklemeniz gerekir:
roles:
- role: firebasedatabase.admin
reason: Allows the extension to write to RTDB.
Benzer şekilde, bir uzantının kullandığı Google API'lerini apis
alanında belirtirsiniz. Kullanıcılar uzantınızı yüklediğinde, bu API'leri projeleri için otomatik olarak etkinleştirmek isteyip istemedikleri sorulur. 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ımlama
Son iki adımda oluşturduğunuz işlev, gelen mesajlar için belirli bir RTDB konumunu izledi. Bazen belirli bir konumu izlemek isteyebilirsiniz. Örneğin, uzantınız yalnızca uzantınız için kullandığınız bir veritabanı yapısında çalışıyorsa. Ancak çoğu zaman bu değerleri, uzantınızı projelerine yükleyen kullanıcılar tarafından yapılandırılabilir hale getirmek istersiniz. Böylece kullanıcılar mevcut veritabanı kurulumlarıyla çalışmak için uzantınızdan yararlanabilir.
Uzantı için yeni mesajları izleyeceği yolu kullanıcı tarafından yapılandırılabilir hale getirin:
extension.yaml
dosyasına birparams
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, kullanıcıların uzantınızı yüklerken ayarlamaları istenen yeni bir dize parametresi tanımlar.
extension.yaml
dosyasındamakeuppercase
beyanınıza dönün veresource
alanını aşağıdaki şekilde değiştirin:resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${param:MESSAGE_PATH}
${param:MESSAGE_PATH}
jetonu, az önce tanımladığınız parametreye referans verir. Uzantı çalıştırıldığında bu jeton, kullanıcının söz konusu parametre için yapılandırdığı değerle değiştirilir. Böylecemakeuppercase
işlevi, kullanıcının belirttiği yolu dinler.extension.yaml
'ün (vePOSTINSTALL.md
'un - daha sonra bu konu hakkında daha fazla bilgi verilecektir) herhangi bir yerinde kullanıcı tanımlı bir parametreye referans vermek için bu söz dizimini kullanabilirsiniz.Kullanıcı tanımlı parametrelere işlev kodunuzdan da erişebilirsiniz.
Son bölümde yazdığınız işlevde, değişiklikleri izlemek için yolu sabit kodladınız. Tetikleyici tanımını, kullanıcı tanımlı değeri referans alacak şekilde değiştirin:
functions/index.js
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate
Firebase Extensions'de bu değişikliğin yalnızca dokümantasyon amacıyla yapıldığını unutmayın: Bir Cloud Functions, uzantı kapsamında dağıtıldığında
extension.yaml
dosyasında bulunan tetikleyici tanımını kullanır ve işlev tanımında belirtilen değeri yoksayar. Yine de kodunuzda bu değerin nereden geldiğini belgelemek iyi bir fikirdir.Çalışma zamanında etkisi olmayan bir kod değişikliği yapmak can sıkıcı olabilir. Ancak buradan çıkarabileceğiniz önemli bir ders, işlev kodunuzdaki kullanıcı tanımlı parametrelere erişebileceğiniz ve bunları işlevin mantığında sıradan bir değer olarak kullanabileceğinizdir. Bu yeteneğinize bir örnek olarak, kullanıcının tanımladığı değere gerçekten eriştiğinizi göstermek için aşağıdaki günlük ifadesini ekleyin:
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. ...
Normalde, kullanıcılardan uzantı yüklerken parametreler için değer sağlamaları istenir. Ancak test ve geliştirme için emülatör kullandığınızda yükleme işlemini atlarsınız. Bu nedenle, kullanıcı tanımlı parametreler için bir
env
dosyası kullanarak değerler sağlarsınız.functions/integration-tests/extensions/rtdb-uppercase-messages.env
dosyasını açın veGREETING
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 yoldan farklı olduğunu unutmayın. Bu yol, güncellenmiş uzantınızı denediğinizde tanımınızın geçerli olduğunu kendinize kanıtlamak içindir.
Ş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
işlevi daha önce olduğu gibi tetiklenir ancak artık kullanıcı tanımlı parametreyi konsol günlüğüne de yazdırır.- Alan:
7. Kullanıcı tanımlı mantık için etkinlik kancaları sağlayın
Bir Firebase ürünü, uzantı yazarları tarafından sağlanan mantığı nasıl tetikleyebilir? Bunu daha önce görmüştünüz: Realtime Database'de yeni kayıt oluşturulması makeuppercase
işlevinizi tetikler. Uzantınız, yükleyen kullanıcılarla benzer bir ilişkiye sahip olabilir: Uzantınız, kullanıcı tarafından tanımlanan mantığı tetikleyebilir.
Bir uzantı, eşzamanlı kanca, eşzamansız kanca veya her ikisini de sağlayabilir. Eşzamanlı kancalar, kullanıcılara uzantının işlevlerinden birinin tamamlanmasını engelleyen görevleri gerçekleştirebilmelerini sağlar. Bu, örneğin, kullanıcılara bir uzantı işini yapmadan önce özel ön işleme yapmanın bir yolunu sunmak için yararlı olabilir.
Bu kılavuzda, uzantınıza bir asenkron kanca ekleyeceksiniz. Bu kanca, kullanıcıların uzantınız büyük harfli mesajı Realtime Database'e yazdıktan sonra çalıştırılacak kendi işleme adımlarını tanımlamalarını sağlar. Asenkron kancalar, kullanıcı tanımlı işlevleri tetiklemek için Eventarc'ı kullanır. Uzantılar, yayınladığı etkinlik türlerini bildirir ve kullanıcılar uzantıyı yüklediğinde ilgilendikleri etkinlik türlerini seçer. Kullanıcı en az bir etkinlik seçerse Firebase, yükleme işleminin bir parçası olarak uzantı için bir Eventarc kanalı oluşturur. Kullanıcılar daha sonra bu kanalda dinleyen ve uzantı yeni etkinlikler yayınladığında tetiklenen kendi bulut işlevlerini dağıtabilir.
Asenkron kanca eklemek için aşağıdaki adımları uygulayın:
extension.yaml
dosyasına, uzantının yayınladığı tek etkinlik türünü açıklayan aşağıdaki bölümü ekleyin: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 etkinliklerinizi her zaman şu biçimi kullanarak adlandırın:
<publisher-id>.<extension-id>.<version>.<description>
. (Henüz yayıncı kimliğiniz olmadığı için şimdiliktest-publisher
değerini kullanın.)makeuppercase
işlevinin sonuna, az önce tanımladığınız türde bir etkinlik yayınlayan kod ekleyin: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
ortam değişkeninin yalnızca kullanıcı en az bir etkinlik türünü etkinleştirdiğinde tanımlanmasından yararlanır.EVENTARC_CHANNEL
tanımlanmazsa kod herhangi bir etkinlik yayınlamaya çalışmaz.Bir Eventarc etkinliğine daha fazla bilgi ekleyebilirsiniz. Yukarıdaki örnekte, etkinlikte yeni oluşturulan değere referans içeren bir
subject
alanı ve orijinal ile büyük harfli mesajları içeren birdata
yükü vardır. Etkinliği tetikleyen kullanıcı tanımlı işlevler bu bilgiyi kullanabilir.Normalde
EVENTARC_CHANNEL
veEXT_SELECTED_EVENTS
ortam değişkenleri, kullanıcının yükleme sırasında seçtiği seçeneklere göre tanımlanır. Emülatörle test yapmak içinrtdb-uppercase-messages.env
dosyasında şu değişkenleri manuel olarak tanımlayın:EVENTARC_CHANNEL=locations/us-central1/channels/firebase EXT_SELECTED_EVENTS=test-publisher.rtdb-uppercase-messages.v1.complete
Bu noktada, uzantınıza asenkron etkinlik kancası eklemek için gereken adımları tamamlamış olursunuz.
Yeni uygulamanız olan bu özelliği denemek için sonraki birkaç adımda uzantıyı yükleyen bir kullanıcı rolüne bürünün:
functions/integration-tests
dizininde yeni bir Firebase projesini başlatın:firebase init functions
İstendiğinde varsayılan proje oluşturmayı reddedin, Cloud Functions dili olarak JavaScript'i seçin ve gerekli bağımlılıkları yükleyin. Bu proje, uzantınızın yüklü olduğu bir kullanıcı projesini temsil eder.
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. Bu durumda işlev, uzantının
complete
etkinliği yayınlamasını bekler ve tetiklendiğinde yeni büyük harflerle yazılmış mesaja üç ünlem işareti ekler.Emülatörü yeniden başlatın. Emülatör, uzantının işlevlerini ve "kullanıcı"nın tanımladığı son işleme işlevini yükler.
Veritabanı emülatör kullanıcı arayüzünü ziyaret edin ve 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
işlevi ve kullanıcınınextraemphasis
işlevi sırayla tetiklenir. Bu daupper
alanınınRECIPE!!!
değerini almasına neden olur.- Alan:
8. Yaşam döngüsü etkinlik işleyicileri ekleme
Şu ana kadar yazdığınız uzantı, mesajları oluşturuldukları sırada işler. Peki kullanıcılarınız uzantıyı yüklediğinde zaten bir ileti veritabanı varsa ne olur? Firebase Extensions'te, uzantınız yüklendiğinde, güncellendiğinde veya yeniden yapılandırıldığında işlemleri tetiklemek için kullanabileceğiniz yaşam döngüsü etkinliği bağlantı noktaları adlı bir özellik bulunur. Bu bölümde, bir kullanıcı uzantınızı yüklediğinde projenin mevcut mesaj veritabanını büyük harfli mesajlarla doldurmak için yaşam döngüsü etkinliği kancalarını kullanacaksınız.
Firebase Extensions, yaşam döngüsü etkinlik işleyicilerinizi çalıştırmak için Cloud Tasks'ı kullanır. Cloud Functions'i kullanarak etkinlik işleyicileri tanımlarsınız. Uzantı örneğiniz desteklenen yaşam döngüsü etkinliklerinden birine ulaştığında, bir işleyici tanımladıysanız işleyici bir Cloud Görevler kuyruğuna eklenir. Ardından Cloud Tasks, işleyiciyi eşzamansız olarak yürütür. Bir yaşam döngüsü etkinlik işleyici çalışırken Firebase konsolu, kullanıcıya uzantı örneğinin devam eden bir işleme görevi olduğunu bildirir. Devam eden durumu ve görev tamamlanma durumunu kullanıcıya bildirmek, işleyici fonksiyonunuza bağlıdır.
Mevcut mesajları dolduran bir yaşam döngüsü etkinlik işleyicisi eklemek için aşağıdakileri yapın:
Görev sırası etkinlikleri tarafından tetiklenen yeni bir Cloud Functions işlevi tanımlayın:
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."); } });
İşlevin, kendini görev sırasına tekrar eklemeden önce yalnızca birkaç kayıt işlediğine dikkat edin. Bu, bir Cloud Function'ın zaman aşımı aralığı içinde tamamlanamayan işlem görevlerini ele almak için yaygın olarak kullanılan bir stratejidir. Bir kullanıcı uzantınızı yüklediğinde veritabanında kaç mesajı olabileceğini tahmin edemeyeceğiniz için bu strateji uygundur.
extension.yaml
dosyasında, dolgu işlevinizitaskQueueTrigger
özelliğine sahip bir uzantı kaynağı olarak bildirin: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ü etkinliğinin işleyicisi olarak tanımlayın:lifecycleEvents: onInstall: function: backfilldata processingMessage: Uppercasing existing messages
Mevcut mesajları doldurmak iyi bir özellik olsa da uzantı bu özellik olmadan da çalışabilir. Bu gibi durumlarda, yaşam döngüsü etkinlik işleyicilerini çalıştırmayı isteğe bağlı hale getirmeniz gerekir.
Bunu yapmak için
extension.yaml
parametresine 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, doldurma işlevinin başında
DO_BACKFILL
parametresinin değerini kontrol edin ve ayarlanmamışsa erken çıkın:functions/index.js
if (!process.env.DO_BACKFILL) { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped."); }
Yukarıdaki değişikliklerle birlikte, uzantı artık yüklendiğinde mevcut mesajları büyük harfe dönüştürecek.
Bu noktaya kadar uzantınızı geliştirmek ve devam eden değişiklikleri test etmek için uzantı emülatörünü kullandınız. Ancak uzantı emülatörü yükleme işlemini atlar. Bu nedenle, onInstall
etkinlik işleyicinizi test etmek için uzantıyı gerçek bir projeye yüklemeniz gerekir. Bu otomatik doldurma özelliğinin eklenmesiyle eğitim uzantısı artık kod olarak tamamlanmış oldu.
9. Gerçek bir Firebase projesine dağıtma
Uzantılar emülatörü, geliştirme sırasında bir uzantıyı hızlı bir şekilde yinelemek için harika bir araç olsa da bir noktada bunu gerçek bir projede denemek isteyebilirsiniz.
Bunu yapmak için önce bazı hizmetlerin etkin olduğu yeni bir proje oluşturun:
- Firebase konsolunda yeni bir proje ekleyin.
- Projenizi, kullandıkça öde Blaze planına yükseltin. Firebase için Cloud Functions, projenizin faturalandırma hesabına sahip olmasını gerektirir. Bu nedenle, uzantı yüklemek için de faturalandırma hesabınız olmalıdır.
- Yeni projenizde Gerçek Zamanlı Veritabanı'nı etkinleştirin.
- Uzantınızın yükleme sırasında mevcut verileri doldurma özelliğini test etmek istediğinizden bazı örnek verileri gerçek zamanlı veritabanı örneğinize aktarın:
- Bazı tohum RTDB verilerini indirin.
- Firebase konsolunun Gerçek Zamanlı Veritabanı sayfasında (diğer) > JSON'u İçe Aktar'ı tıklayın ve az önce indirdiğiniz dosyayı seçin.
orderByChild
yöntemini kullanacak şekilde doldurma işlevini etkinleştirmek için veritabanını, mesajlarıupper
değerine göre dizine ekleyecek şekilde yapılandırın:{ "rules": { ".read": false, ".write": false, "messages": { ".indexOn": "upper" } } }
Şimdi, uzantınızı yerel kaynaktan yeni projeye yükleyin:
Firebase projeniz için yeni bir dizin oluşturun:
mkdir ~/extensions-live-test && cd ~/extensions-live-test
Çalışma dizininde bir Firebase projesini başlatın:
firebase init database
İstendiğinde, yeni oluşturduğunuz projeyi seçin.
Uzantı yükleme
firebase ext:install /path/to/rtdb-uppercase-messages
Firebase CLI aracını kullanarak uzantı yüklerken kullanıcı deneyiminin nasıl olduğunu burada görebilirsiniz. Yapılandırma aracı mevcut veritabanınızı doldurmak isteyip istemediğinizi sorduğunda "evet"i seçtiğinizden emin olun.
Yapılandırma seçeneklerini seçtikten sonra Firebase KSA, yapılandırmanızı
extensions
dizinine kaydeder ve uzantı kaynak konumunufirebase.json
dosyasına yazar. Bu iki kayıt birlikte uzantı manifesti olarak adlandırılır. Kullanıcılar, uzantı yapılandırmalarını kaydetmek ve farklı projelere dağıtmak için manifesti kullanabilir.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üklemeli ve yüklemelidir. Yükleme tamamlandıktan sonra doldurma görevi çalıştırılır ve birkaç dakika içinde veritabanınız büyük harfli mesajlarla güncellenir. İleti veritabanına yeni düğümler ekleyin ve uzantının yeni mesajlar için de çalıştığından emin olun.
10. Doküman yazma
Uzantınızı kullanıcılarla paylaşmadan önce, başarılı olmaları için yeterli sayıda belge sağladığınızdan emin olun.
Uzantı projesini başlattığınızda Firebase CLI, gereken minimum belgelerin saplama sürümlerini oluşturdu. Bu dosyaları, oluşturduğunuz uzantıyı doğru yansıtacak şekilde güncelleyin.
extension.yaml
Bu uzantıyı geliştirirken bu dosyayı zaten güncellediğiniz için şu anda başka bir güncelleme yapmanız gerekmez.
Bununla birlikte, bu dosyada yer alan belgelerin önemini de göz ardı etmeyin. extension.yaml
dosyası, bir uzantının önemli tanımlayıcı bilgilerinin (ad, açıklama, yazar, resmi depo konumu) yanı sıra her kaynak ve kullanıcı tarafından yapılandırılabilir parametre için kullanıcılara yönelik belgeler içerir. Bu bilgiler Firebase konsolunda, Uzantı Merkezi'nde ve Firebase KSA'da kullanıcılara gösterilir.
PREINSTALL.md
Bu dosyada, kullanıcının uzantınızı yüklemeden önce ihtiyaç duyduğu bilgileri sağlayın: Uzantının ne yaptığını kısaca açıklayın, ön koşulları açıklayın ve kullanıcıya uzantıyı yüklemenin faturalandırmayla ilgili sonuçları hakkında bilgi verin. Ek bilgiler içeren bir web siteniz varsa burası da bağlantı vermek için iyi bir yerdir.
Bu dosyanın metni, kullanıcıya Uzantı Merkezi'nde ve firebase ext:info
komutuyla gösterilir.
Aşağıda bir PREINSTALL 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, uzantınızı başarıyla yükleyen kullanıcılar için yararlı bilgiler içerir. Örneğin, takip eden kurulum adımları, uzantının çalışırken gösterildiği bir örnek vb.
POSTINSTALL.md dosyasının içeriği, bir uzantı yapılandırılıp yüklendikten sonra Firebase konsolunda gösterilir. Bu dosyada kullanıcı parametrelerine referans verebilirsiniz. Bu parametreler, yapılandırılan değerlerle değiştirilir.
Eğitim uzantısı için örnek bir yükleme sonrası dosyası aşağıda 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
Ayrıca, bir uzantının sürümleri arasında yaptığınız değişiklikleri CHANGELOG.md
dosyasında belgelemeniz gerekir.
Örnek uzantı daha önce hiç yayınlanmadığından değişiklik günlüğünde yalnızca bir giriş vardır:
## Version 0.0.1
Initial release of the _Convert messages to upper case_ extension.
README.md
Çoğu uzantı, uzantının deposunu ziyaret eden kullanıcılar için bir readme dosyası da sağlar. Bu dosyayı manuel olarak yazabilir veya komutu kullanarak bir readme dosyası oluşturabilirsiniz.
Bu kılavuzun amacı doğrultusunda, readme dosyası yazmayı atlayın.
Ek dokümanlar
Yukarıda bahsedilen dokümanlar, kullanıcılara sunmanız gereken minimum doküman grubudur. Birçok uzantı, kullanıcıların uzantıları başarıyla kullanabilmesi için daha ayrıntılı belgelere ihtiyaç duyar. Bu durumda, ek dokümanlar yazıp kullanıcıları yönlendirebileceğiniz bir yerde barındırmanız gerekir.
Bu kılavuzun amacı doğrultusunda daha kapsamlı dokümanlar yazmayın.
11. Uzantılar Merkezi'nde yayınlama
Uzantı kodunuz tamamlandı ve dokümante edildi. Artık uzantınızı Uzantı Merkezi'nde dünyayla paylaşmaya hazırsınız. Ancak bu yalnızca bir eğitim olduğu için bunu yapmayın. Burada ve Firebase Extensions yayıncı belgelerinin diğer bölümlerinde öğrendiklerinizi kullanarak ve Firebase tarafından yazılan resmi uzantıların kaynağını inceleyerek kendi uzantınızı yazmaya başlayın.
Çalışmanızı Uzantılar Merkezi'nde yayınlamaya hazır olduğunuzda aşağıdaki adımları uygulayın:
- İlk uzantınızı yayınlıyorsanız uzantı yayıncısı olarak kaydolun. Uzantı yayıncısı olarak kaydolduğunuzda, kullanıcıların sizi uzantılarınızın yazarı olarak hızlı bir şekilde tanımlamasını sağlayan bir yayıncı kimliği oluşturursunuz.
Uzantılarınızın kaynak kodunu herkes tarafından doğrulanabilir bir konumda barındırın. Kodunuz doğrulanabilir bir kaynaktan edinildiğinde Firebase, uzantınızı doğrudan bu konumdan yayınlayabilir. Bu sayede, uzantınızın şu anda kullanıma sunulan sürümünü yayınladığınızdan emin olursunuz ve kullanıcıların projelerine yükledikleri kodu incelemelerine olanak tanıyarak onlara yardımcı olursunuz.
Şu anda bu, uzantınızı herkese açık bir GitHub deposunda kullanıma sunmak anlamına gelir.
firebase ext:dev:upload
komutunu kullanarak uzantınızı Uzantı Merkezi'ne yükleyin.Firebase konsolunda yayıncı kontrol panelinize gidin, yeni yüklediğiniz uzantıyı bulun ve "Uzantılar Merkezi'nde yayınla"yı tıklayın. Bu işlem, inceleme ekibimizden inceleme isteğinde bulunulmasını gerektirir ve birkaç gün sürebilir. Uzantı, onaylanırsa Extensions Hub'da yayınlanır. Başvurunuz reddedilirse nedenini açıklayan bir mesaj alırsınız. Ardından, bildirilen sorunları giderip incelenmek üzere yeniden gönderebilirsiniz.