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. Makul bir şekilde tek bir dosyaya sığamayacak kadar çok işleviniz olabilir veya farklı ekipler, farklı işlev gruplarını konuşlandırarak bir ekibin üzerine yazma veya başka bir ekibin işlevlerini yanlışlıkla silme riski oluşturabilir. Cloud Functions, işlevlerinizde gezinmeyi ve işlevlerinizi sürdürmeyi kolaylaştırmak için kodunuzu düzenlemenin farklı yollarını sunar.

İşlevleri kod tabanlarında düzenleme

Tek bir depo monorepo kurulumunda birden çok havuz veya alt paket genelinde 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 sonraki sürümlerde desteklenir.

Birden çok havuzu yönetme

codebase özelliği, birden fazla havuzun yönetimini basitleştirmeye yardımcı olabilir. İşlevleri aynı Firebase projesine dağıtan iki farklı havuza sahip olduğunuz 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 işlevler yapılandırma bölümüne benzersiz bir kod tabanı ek 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 sizden doğrudan deponuzun dışında 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 çok kaynak paketini yönetme (monorepo)

codebase özelliği, tek bir havuzda birden çok kaynak paketin yönetimini basitleştirmeye yardımcı olabilir. Çeşitli alt paketlere yayılmış işlev 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 uygundur:

  • Bir monorepo kurulumunuz var ve farklı ekiplerin kendi işlev tanımlarını izole bir pakette yönetmesini sağlayın.
  • Ağır bir dış bağımlılığa ve uzun süren bir başlatmaya 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 çok 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 konuşlandırma komutunda 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)...
...

İşlevleri birden çok dosyaya yaz

Cloud Functions'a başlarken ilk birkaç işlevinizi tek bir dosyaya koyabilirsiniz:

index.js


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

Bu, birkaç işlevden fazlasıyla yönetilmesi zor olabilir. Bunun yerine, her işlev için tüm mantığınızı kendi dosyasına koyabilir ve index.js dosyanızı basit bir dışa aktarma listesi olarak kullanabilirsiniz:

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;

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, metrikleri raporlamak için kullanılan bir işlev grubunuz 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ızda 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ıklarında, işlevlerin önüne 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, eylemi tek bir grupla sınırlayabilirsiniz:


firebase deploy --only functions:metrics

Sonraki adımlar

Bulut İşlevleri hakkında daha fazla bilgi edinmek için şuraya bakın: