Birden çok işlevi organize etme


Cloud Functions'ı projenize entegre ettikçe kodunuz birçok bağımsız işlev içerecek şekilde genişleyebilir. Tek bir dosyaya sığmayacak kadar çok işleviniz olabilir veya farklı ekipler farklı işlev grupları dağıtabilir. Bu da bir ekibin başka bir ekibin işlevlerini üzerine yazma veya yanlışlıkla silme riski oluşturur. Cloud Functions, işlevleriniz arasında gezinmeyi ve işlevlerinizi yönetmeyi kolaylaştırmak için kodunuzu düzenlemenin farklı yollarını sunar.

Kod tabanlarındaki işlevleri düzenleme

Tek bir depo monorepo kurulumunda birden fazla depo veya alt paketteki büyük bir işlev koleksiyonunu yönetmek için firebase.json içindeki işlev yapılandırma nesnesinin codebase mülkünü kullanabilirsiniz:

# firebase.json
"functions": {
  "codebase": "my-codebase"
  # NOTE: Codebase must be less than 63 characters and can contain only
  # lowercase letters, numeric characters, underscores, and dashes.
}

codebase mülkü, Firebase CLI 10.7.1 ve sonraki sürümlerde desteklenir.

Birden fazla depoyu yönetme

codebase mülkü, birden fazla deponun yönetimini basitleştirmeye yardımcı olabilir. Aynı Firebase projesine işlev dağıtan iki farklı depoya sahip olduğunuzu varsayalım:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

Kod tabanı ek açıklamaları olmadan Firebase CLI, dağıtım sırasında diğer depoda tanımlanan işlevleri silmenizi ister:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
  functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
        fn1FromRepoB
        fn2FromRepoB
        ...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

Her proje deposundaki firebase.json işlevlerinin yapılandırma bölümüne benzersiz bir kod tabanı ekleyerek bu sorunu önleyebilirsiniz:

# repoA/firebase.json
"functions": {
  "codebase": "repo-a"
}

# repoB/firebase.json
"functions": {
  "codebase": "repo-b"
}

Kod tabanı ek açıklamaları sayesinde Firebase CLI artık doğrudan deponuzdan hariç tanımlanan işlevleri silmenizi istemez:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
  functions: functions folder uploaded successfully
#  Gleefully ignores functions from repoB
i  functions: creating Node.js 16 function fnFromRepoA (us-central1)...
  Deploy Complete!

Birden fazla kaynak paketini yönetme (monorepo)

codebase mülkü, tek bir depoda birden fazla kaynak paketinin yönetimini basitleştirmeye yardımcı olabilir. Birkaç alt pakete yayılmış işlev tanımlarının bulunduğu bir Firebase proje dizininizin olduğu bir durumu inceleyelim:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

Bu kurulum aşağıdaki kullanım alanlarına uygundur:

  • Monorepo kurulumunuza sahipsiniz ve farklı ekipler, kendi işlev tanımlarını izole bir pakette yönetiyor.
  • Ağır harici bağımlılığı ve uzun süren bir başlatma işlemi olan bir işleviniz var ve bu işlevi gecikmeye duyarlı diğer işlevlerden ayırmak istiyorsunuz.

Bu şekilde monrepo kurulumunu desteklemek için firebase.json içinde birden fazla işlev yapılandırması tanımlayın:

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

Bu yapılandırmayla Firebase CLI, tüm paketlerdeki işlevleri tek bir dağıtım komutuyla dağıtır:

$ firebase deploy --only functions
i  deploying functions
i  functions: preparing codebase team-a for deployment
i  functions: preparing codebase team-b for deployment
i  functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i  functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Belirli bir kod tabanını da dağıtabilirsiniz:

$ firebase deploy --only functions:team-b
i  deploying functions
i  functions: preparing codebase team-b for deployment
i  functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Fonksiyonları birden fazla dosyaya yazma

Cloud Functions ile çalışmaya başladığınızda ilk birkaç işlevinizi tek bir dosyaya koyabilirsiniz:

index.js

const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

main.py

from firebase_functions import https_fn

@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello bar!")

Bu, birkaçtan fazla işlev olduğunda yönetmesi zor olabilir. Bunun yerine, her işlev için tüm mantığınızı kendi dosyasına koyabilir ve kaynak dosyanızı dışa aktarma listesi olarak kullanabilirsiniz:

Node.js

foo.js

const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js

const functions = require('firebase-functions/v1');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.js

const foo = require('./foo');
const bar = require('./bar');
exports.foo = foo.foo;
exports.bar = bar.bar;

Python

foo.py

from firebase_functions import https_fn

@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

bar.py

from firebase_functions import https_fn

@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

main.py

from fn_impl.foo import *
from fn_impl.bar import *

Bu kurulumda aşağıdaki gibi bir proje dizini yapısı varsayılır:

my-project
├── firebase.json
└── functions
    ├── fn_impl
    │   ├── __init__.py
    │   ├── foo.py
    │   └── bar.py
    ├── main.py
    └── requirements.txt

fn_impl: Herhangi bir ad olabilir

__init__.py: Zorunlu ancak boş olabilir

Grup işlevleri

Birçok projede işlevler, birlikte dağıtılması ve bakımı yapılması gereken mantıksal gruplara ayrılabilir. Örneğin, metrikleri raporlamak için kullanılan bir işlev grubunuz olabilir:

metrics.js


const functions = require('firebase-functions/v1');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

Aşağıdaki işlevleri index.js dosyanıza aktarırken bir gruba yerleştirebilirsiniz:

index.js


// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

Dağıtıldığında işlevlerin başına gruplarının adı eklenir. Bu nedenle, bu örnekte işlevler metrics-usageStats ve metrics-nightlyReport olarak adlandırılır.

İşlevleri dağıtırken işlemi tek bir grupla sınırlayabilirsiniz:


firebase deploy --only functions:metrics

Sonraki adımlar

Cloud Functions hakkında daha fazla bilgi edinmek için: