Saat Anda mengintegrasikan Cloud Functions ke dalam project, kode Anda dapat diluaskan agar dapat menampung banyak fungsi independen. Anda mungkin memiliki terlalu banyak fungsi untuk ditampung dalam satu file secara wajar, atau tim yang berbeda mungkin men-deploy grup fungsi yang berbeda pula, sehingga menimbulkan risiko satu tim menimpa atau tidak sengaja menghapus fungsi tim lain. Cloud Functions menawarkan berbagai cara untuk mengatur kode Anda agar lebih mudah untuk menavigasi dan memelihara fungsi.
Mengatur fungsi di codebase
Anda dapat menggunakan properti codebase
objek konfigurasi fungsi di firebase.json
untuk mengelola fungsi dalam jumlah besar di beberapa repositori atau sub-paket dalam satu penyiapan monorepo repositori:
# 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.
}
Properti codebase
didukung di Firebase CLI v10.7.1 dan yang lebih baru.
Mengelola beberapa repositori
Properti codebase
dapat membantu menyederhanakan pengelolaan beberapa repositori. Perhatikan kasus dua repositori berbeda yang men-deploy beberapa fungsi ke project Firebase yang sama:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
Tanpa anotasi codebase, Firebase CLI akan meminta Anda untuk menghapus fungsi yang ditentukan di repositori lain pada saat men-deploy:
$ (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)
Anda dapat menghindari masalah ini dengan menambahkan anotasi codebase unik di bagian konfigurasi fungsi firebase.json
di setiap repositori project:
# repoA/firebase.json
"functions": {
"codebase": "repo-a"
}
# repoB/firebase.json
"functions": {
"codebase": "repo-b"
}
Dengan anotasi codebase, Firebase CLI tidak lagi meminta Anda untuk menghapus fungsi yang ditentukan di luar repositori antara:
$ (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!
Mengelola beberapa paket sumber (monorepo)
Properti codebase
dapat membantu menyederhanakan pengelolaan beberapa paket sumber dalam satu repositori. Mari kita lihat kasus sebuah direktori project firebase dengan definisi fungsi yang tersebar di beberapa subpaket:
$ tree .
├── firebase.json
├── teamA
│ ├── index.js
│ └── package.json
└── teamB
├── index.js
└── package.json
Penyiapan ini cocok dengan kasus penggunaan berikut:
- Anda memiliki penyiapan monorepo dan meminta beberapa tim yang berbeda mengelola definisi fungsinya sendiri-sendiri dalam paket terpisah.
- Anda memiliki fungsi dengan dependensi eksternal yang berat serta inisialisasi yang berjalan lama, dan ingin memisahkan fungsi tersebut dari fungsi lainnya yang sensitif terhadap latensi.
Untuk mendukung penyiapan monrepo seperti ini, tentukan beberapa konfigurasi fungsi di firebase.json
:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
Dengan konfigurasi ini, Firebase CLI men-deploy fungsi dari semua paket dalam satu perintah deploy:
$ 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)...
...
Anda juga dapat men-deploy codebase tertentu:
$ 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)...
...
Menulis fungsi di beberapa file
Saat memulai Cloud Functions, Anda dapat menempatkan beberapa fungsi pertama dalam satu file:
index.js
const functions = require('firebase-functions'); exports.foo = functions.https.onRequest((request, response) => { // ... }); exports.bar = functions.https.onRequest((request, response) => { // ... });
Untuk fungsi yang sedikit lebih banyak, hal tersebut sulit untuk dikelola. Sebagai gantinya, Anda dapat memasukkan semua logika untuk setiap fungsi dalam file-nya sendiri dan menggunakan file index.js
Anda sebagai daftar ekspor sederhana:
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;
Mengelompokkan fungsi
Dalam banyak project, fungsi dapat dipisahkan menjadi grup logika yang harus di-deploy dan dikelola secara bersamaan. Misalnya, Anda mungkin memiliki grup fungsi yang digunakan untuk melaporkan metrik:
metrics.js
const functions = require('firebase-functions'); exports.usageStats = functions.https.onRequest((request, response) => { // ... }); exports.nightlyReport = functions.https.onRequest((request, response) => { // ... });
Anda dapat memasukkan fungsi ini ke grup saat mengekspornya di file index.js
Anda:
index.js
// Export both functions from metrics.js in the "metrics" group: // - metrics-usageStats // - metrics-nightlyReport exports.metrics = require('./metrics');
Saat di-deploy, fungsi akan diawali dengan nama grupnya, sehingga dalam contoh ini fungsi diberi nama metrics-usageStats
dan metrics-nightlyReport
.
Saat men-deploy fungsi, Anda dapat membatasi tindakan ke satu grup:
firebase deploy --only functions:metrics