Birden çok işlevi organize etme


Cloud Functions projenize entegre oldukça, kodunuz birçok bağımsız işlev içerir. Yapılacak çok fazla işlev varsa tek bir dosyaya sığmayabilir veya farklı ekipler farklı gruplar dağıtabilir bir ekibin üzerine yazması veya yanlışlıkla silmesi riski yaratmak, fonksiyonların başka bir ekibin fonksiyonlarıdır. Cloud Functions, verilerinizi düzenlemenize yardımcı olacak fonksiyonlarınızı yönetmeyi ve gezinmeyi kolaylaştıran bir kod kullanmanız gerekir.

Kod tabanlarındaki işlevleri düzenleme

İşlevler yapılandırma nesnesinin codebase özelliğini şurada kullanabilirsiniz: Birden fazla işlev koleksiyonunu yönetmek için firebase.json tek bir depo monorepo kurulumunda depoları veya alt paketleri içerir:

# 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ümlerde desteklenir.

Birden fazla depoyu yönetme

codebase özelliği, birden fazla öğenin yönetimini basitleştirebilir. ekleyebilirsiniz. İki farklı deponuzun olduğu bir durumu inceleyelim. aynı Firebase projesine işlev dağıtan bir etiket içerir:

$  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 silin:

$ (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)

firebase.json işlev yapılandırma bölümünü içeren her proje deposunda:

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

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

Kod tabanı ek açıklamasıyla, Firebase CLI artık sizden veya mevcut deponuzun dışında tanımlanan işlevler:

$ (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 çok kaynak paketi yönetme (monorepo)

codebase özelliği, birden fazla kaynağın yönetimini basitleştirmeye yardımcı olabilir. tek depoda toplamanızı sağlar. Firebase'inizin olduğu bir örneği inceleyelim. İşlev tanımlarının birkaç alt pakete yayıldığı proje dizini:

$  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ı ekiplerin izole bir pakette kendi işlev tanımlarını yönetmesini sağlıyor.
  • Yoğun bir dış bağımlılığı ve uzun süreli başlatması 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 birden fazla işlev yapılandırması tanımlayın firebase.json etki alanında:

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

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

$ 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)...
...

Birden çok dosyaya işlev yazma

Cloud Functions'ı kullanmaya başlarken ilk olarak işlevlerini tek bir dosyada düzenleyebilir:

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ç farklı işlevle bunu yönetmek zor olabilir. Bunun yerine her bir işlev için tüm mantığınızı kendi dosyasına koyabilir ve kaynak dosyayı dışa aktarabileceksiniz:

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 kurulumda proje dizini yapısının aşağıdaki gibi 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: Zorunludur, ancak boş olabilir

Grup işlevleri

Birçok projede, işlevler mantıklı gruplar halinde ayrılabilir. birlikte dağıtılıp sürdürülmesi gerekir. Örneğin, çalışanlardan oluşan raporlama metrikleri için kullanılan işlevler:

metrikler.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ızda dışa aktarırken bir gruba yerleştirebilirsiniz. dosya:

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 gruplarının adı eklenir. Bu nedenle, Bu örnekte, işlevler metrics-usageStats olarak adlandırılır. ve metrics-nightlyReport.

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


firebase deploy --only functions:metrics
.

Sonraki adımlar

Cloud Functions hakkında daha fazla bilgi edinmek için aşağıdaki konulara göz atın: