Birden fazla işlevi organize edin


Bulut İşlevlerini projenize entegre ettikçe kodunuz birçok bağımsız işlevi içerecek şekilde genişleyebilir. Tek bir dosyaya sığmayacak kadar çok sayıda işleviniz olabilir veya farklı ekipler farklı işlev gruplarını dağıtabilir, bu da bir ekibin başka bir ekibin işlevlerinin üzerine yazması veya yanlışlıkla silmesi riskini doğurabilir. Cloud Functions, işlevlerinizde gezinmeyi ve korumayı kolaylaştırmak amacıyla kodunuzu düzenlemenin farklı yollarını sunar.

İşlevleri kod tabanlarında düzenleyin

Tek bir depo monorepo kurulumunda birden fazla depo veya alt paketteki geniş bir işlev koleksiyonunu yönetmek için firebase.json işlevler yapılandırma nesnesinin codebase ö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 v10.7.1 ve üzeri sürümlerde desteklenir.

Birden fazla depoyu yönetme

codebase özelliği, birden fazla havuzun yönetimini basitleştirmeye yardımcı olabilir. Aynı Firebase projesine işlevler 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ı ek açıklamaları olmasaydı 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 dosyasının 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"
}

Firebase CLI, kod tabanı ek açıklamasıyla artık acil deponuzun dışında tanımlanan işlevleri silmenizi istememektedir:

$ (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 özelliği, tek bir depoda birden fazla kaynak paketinin yönetimini basitleştirmeye yardımcı olabilir. Birkaç alt pakete yayılmış fonksiyon tanımlarına sahip 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 durumlarına uyar:

  • Bir monorepo kurulumunuz var ve farklı ekiplerin kendi fonksiyon tanımlarını yalıtılmış bir pakette yönetmesini sağlıyorsunuz.
  • Yoğun dış bağımlılığı olan ve uzun süren bir başlatma işlemine sahip bir işleviniz var ve bu işlevi gecikmeye duyarlı diğer işlevlerden yalıtmak istiyorsunuz.

Bunun gibi monrepo kurulumunu desteklemek için firebase.json 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)...
...

Ayrıca 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)...
...

İşlevleri birden çok dosyaya yazma

Cloud Functions'ı kullanmaya başladığınızda ilk birkaç işlevinizi tek bir dosyaya yerleştirebilirsiniz:

index.js

const functions = require('firebase-functions');
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!")

Birkaç fonksiyondan fazlası ile bunu yönetmek zor olabilir. Bunun yerine, her işlev için mantığınızın tamamını kendi dosyasına koyabilir ve kaynak dosyanızı bir dışa aktarma listesi olarak kullanabilirsiniz:

Node.js

foo.js

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

bar.js

const functions = require('firebase-functions');
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 kurulum aşağıdaki gibi bir proje dizini yapısını varsayar:

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

fn_impl : Herhangi bir ada sahip olabilir

__init__.py : Gerekli, ancak boş olabilir

Grup işlevleri

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

metrics.js


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

Bu işlevleri index.js dosyanıza dışa aktarırken bir gruba koyabilirsiniz:

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şlevlere grup adı eklenir; dolayısıyla bu örnekte işlevler metrics-usageStats ve metrics-nightlyReport olarak adlandırılacaktır.

İşlevleri dağıtırken eylemi tek bir grupla sınırlandırabilirsiniz:


firebase deploy --only functions:metrics

Sonraki adımlar

Bulut İşlevleri hakkında daha fazla bilgi edinmek için bkz.: