Cloud Functions'ı projenize entegre ederken kodunuz birçok bağımsız işlevi içerecek şekilde genişleyebilir. Tek bir dosyaya sığamayacak kadar çok işleviniz olabilir veya farklı ekipler farklı işlev grupları dağıtarak bir ekibin diğer ekibin işlevlerini üzerine yazma ya da yanlışlıkla silme riskini oluşturabilir. Cloud Functions, işlevlerinizde gezinmeyi ve işlevlerinizi korumayı kolaylaştırmak için kodunuzu düzenlemenin farklı yollarını sunar.
Kod tabanlarındaki işlevleri düzenleme
Tek bir monorepo kurulumundaki birden fazla depo veya alt paket genelinde büyük bir işlev koleksiyonunu yönetmek için codebase
içindeki işlevler yapılandırma nesnesinin firebase.json
özelliğini 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
özelliği, Firebase CLI 10.7.1 ve sonraki sürümlerinde desteklenir.
Birden fazla depoyu yönetme
codebase
özelliği, birden fazla deponun yönetimini basitleştirmeye yardımcı olabilir. Aynı Firebase projesine işlev dağıtan iki farklı deponuzun olduğu bir durumu inceleyelim:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
Kod tabanı açıklamaları olmadan Firebase CLI, dağıtım sırasında diğer depoda tanımlanan işlevleri silmenizi isterdi:
$ (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şlev yapılandırması bölümüne benzersiz bir kod tabanı açıklaması ekleyerek bu sorunu önleyebilirsiniz:
# repoA/firebase.json
"functions": {
"codebase": "repo-a"
}
# repoB/firebase.json
"functions": {
"codebase": "repo-b"
}
Kod tabanı ek açıklaması sayesinde Firebase CLI artık doğrudan deponuzun dışında tanımlanan işlevleri silmenizi istemiyor:
$ (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 (monorepo) yönetme
codebase
özelliği, tek bir depoda birden fazla kaynak paketin yönetimini basitleştirmeye yardımcı olabilir. İşlev tanımlarının birkaç alt pakete yayıldığı 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 kurulumunuz var ve farklı ekipler kendi işlev tanımlarını izole bir pakette yönetiyor.
- Ağır bir dış 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 gibi 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, tek bir dağıtım komutunda tüm paketlerdeki işlevleri 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)...
...
Birden fazla dosyada fonksiyon yazma
Cloud Functions ile çalışmaya başlarken ilk birkaç işlevinizi tek bir dosyaya yerleştirebilirsiniz:
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 durum, birkaç işlevden fazlası olduğunda yönetilmesi zor bir hale gelebilir. Bunun yerine, her işlevle ilgili tüm mantığınızı kendi dosyasına yerleştirebilir 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ı olduğu 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 sürdürülmesi gereken mantıksal gruplara ayrılabilir. Örneğin, raporlama metrikleri 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) => { // ... });
Bu işlevleri index.js
dosyanıza aktarırken gruplandırabilirsiniz:
index.js
// Export both functions from metrics.js in the "metrics" group: // - metrics-usageStats // - metrics-nightlyReport exports.metrics = require('./metrics');
İşlevler dağıtıldığında gruplarının adıyla öneklenir. 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: