همانطور که توابع ابری را در پروژه خود ادغام میکنید، کد شما میتواند گسترش یابد و شامل بسیاری از توابع مستقل شود. ممکن است توابع زیادی داشته باشید که به طور منطقی در یک فایل جا نشوند، یا تیمهای مختلف ممکن است گروههای مختلفی از توابع را مستقر کنند، که این امر خطر بازنویسی یا حذف تصادفی توابع تیم دیگر توسط یک تیم را ایجاد میکند. توابع ابری روشهای مختلفی برای سازماندهی کد شما ارائه میدهد تا پیمایش و نگهداری توابع شما آسانتر شود.
سازماندهی توابع در پایگاههای کد
شما میتوانید از ویژگی codebase شیء پیکربندی توابع در firebase.json برای مدیریت مجموعهای بزرگ از توابع در چندین مخزن یا زیربسته در یک تنظیم monorepo مخزن واحد استفاده کنید:
# 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 در Firebase CLI نسخه 10.7.1 و بالاتر پشتیبانی میشود.
مدیریت چندین مخزن
ویژگی codebase میتواند به سادهسازی مدیریت چندین مخزن کمک کند. بیایید حالتی را بررسی کنیم که دو مخزن مختلف دارید که توابع را در یک پروژه Firebase مستقر میکنند:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
بدون حاشیهنویسیهای کدبیس، رابط خط فرمان فایربیس در زمان استقرار از شما میخواست که توابع تعریفشده در مخزن دیگر را حذف کنید:
$ (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 در هر مخزن پروژه، از این مشکل جلوگیری کنید:
# repoA/firebase.json
"functions": {
"codebase": "repo-a"
}
# repoB/firebase.json
"functions": {
"codebase": "repo-b"
}
با حاشیهنویسی کدبیس، رابط خط فرمان فایربیس دیگر از شما نمیخواهد توابع تعریفشده در خارج از مخزن فوری خود را حذف کنید:
$ (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!
مدیریت چندین بسته منبع (monorepo)
ویژگی codebase میتواند به سادهسازی مدیریت چندین بستهی منبع در یک مخزن واحد کمک کند. بیایید حالتی را بررسی کنیم که در آن یک دایرکتوری پروژهی firebase با تعاریف توابع پخششده در چندین بستهی فرعی دارید:
$ tree .
├── firebase.json
├── teamA
│ ├── index.js
│ └── package.json
└── teamB
├── index.js
└── package.json
این تنظیمات برای موارد استفاده زیر مناسب است:
- شما یک مونوریپو راهاندازی کردهاید و تیمهای مختلف، تعاریف تابع خود را در یک بستهی مجزا مدیریت میکنند.
- شما تابعی با وابستگی خارجی سنگین و مقداردهی اولیه طولانی مدت دارید و میخواهید آن تابع را از سایر توابع حساس به تأخیر جدا کنید.
برای پشتیبانی از تنظیمات monrepo به این شکل، پیکربندی چندین تابع را در firebase.json تعریف کنید:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
با این پیکربندی، رابط خط فرمان فایربیس (Firebase CLI) توابع را از همه بستهها در یک دستور 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)...
...
همچنین میتوانید یک کدبیس خاص را مستقر کنید:
$ 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)...
...
نوشتن توابع در چندین فایل
هنگام شروع کار با Cloud Functions ممکن است چند تابع اول خود را در یک فایل واحد قرار دهید:
ایندکس.js
const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
// ...
});
exports.bar = functions.https.onRequest((request, response) => {
// ...
});
فایل اصلی.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!")
مدیریت این کار با بیش از چند تابع میتواند دشوار شود. در عوض، میتوانید تمام منطق خود را برای هر تابع در فایل جداگانهای قرار دهید و از فایل منبع خود به عنوان لیستی از خروجیها استفاده کنید:
نود جی اس
فود.جیاس
const functions = require('firebase-functions/v1'); exports.foo = functions.https.onRequest((request, response) => { // ... });
نوار.js
const functions = require('firebase-functions/v1'); exports.bar = functions.https.onRequest((request, response) => { // ... });
ایندکس.js
const foo = require('./foo'); const bar = require('./bar'); exports.foo = foo.foo; exports.bar = bar.bar;
پایتون
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!")
نوار.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!")
فایل اصلی.py
from fn_impl.foo import *
from fn_impl.bar import *
این تنظیمات، ساختار دایرکتوری پروژه مانند زیر را در نظر میگیرد:
my-project
├── firebase.json
└── functions
├── fn_impl
│ ├── __init__.py
│ ├── foo.py
│ └── bar.py
├── main.py
└── requirements.txt
fn_impl : میتواند هر نامی داشته باشد
__init__.py : الزامی است، اما میتواند خالی باشد
توابع گروهی
در بسیاری از پروژهها، توابع را میتوان به گروههای منطقی تقسیم کرد که باید با هم مستقر و نگهداری شوند. برای مثال، ممکن است گروهی از توابع برای گزارش معیارها داشته باشید:
metrics.js
const functions = require('firebase-functions/v1'); exports.usageStats = functions.https.onRequest((request, response) => { // ... }); exports.nightlyReport = functions.https.onRequest((request, response) => { // ... });
میتوانید این توابع را هنگام اکسپورت کردن در فایل index.js خود، در یک گروه قرار دهید:
ایندکس.js
// Export both functions from metrics.js in the "metrics" group: // - metrics-usageStats // - metrics-nightlyReport exports.metrics = require('./metrics');
هنگام استقرار، توابع با نام گروه خود پیشوند میشوند، بنابراین در این مثال توابع metrics-usageStats و metrics-nightlyReport نامگذاری میشوند.
هنگام استقرار توابع، میتوانید عملکرد را به یک گروه واحد محدود کنید:
firebase deploy --only functions:metrics
مراحل بعدی
برای کسب اطلاعات بیشتر در مورد Cloud Functions ، به موارد زیر مراجعه کنید: