عند دمج Cloud Functions في مشروعك، يمكن أن تتوسّع التعليمات البرمجية لتشمل العديد من الدوال المستقلة. قد يكون لديك عدد كبير جدًا من الدوال بحيث لا يمكن وضعها في ملف واحد، أو قد تنشر فِرق مختلفة مجموعات مختلفة من الدوال، ما يؤدي إلى خطر أن يكتب فريق ما فوق دوال فريق آخر أو يحذفها عن طريق الخطأ. توفّر Cloud Functions طرقًا مختلفة لتنظيم الرمز البرمجي بهدف تسهيل التنقّل بين الدوال والحفاظ عليها.
تنظيم الدوال في قواعد الرموز
يمكنك استخدام السمة 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
في الإصدار 10.7.1 من واجهة سطر الأوامر (CLI) في Firebase والإصدارات الأحدث.
إدارة مستودعات متعددة
يمكن أن تساعد السمة codebase
في تبسيط إدارة مستودعات متعددة. لنتناول حالة لديك فيها مستودعان مختلفان
ينشران دوالاً إلى مشروع Firebase نفسه:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
بدون تعليقات توضيحية لقاعدة الرموز، كان من المفترض أن يطلب منك Firebase CLI حذف الدوال المحدّدة في المستودع الآخر عند النشر:
$ (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"
}
باستخدام ميزة "التعليق التوضيحي لقاعدة الرموز"، لن يطلب منك Firebase CLI حذف الدوال المحدّدة خارج المستودع المباشر:
$ (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
يناسب هذا الإعداد حالات الاستخدام التالية:
- لديك إعداد مستودع واحد وتدير فِرق مختلفة تعريفات الوظائف الخاصة بها في حزمة معزولة.
- لديك دالة تعتمد بشكل كبير على مصدر خارجي وتستغرق وقتًا طويلاً في عملية التهيئة، وتريد عزل هذه الدالة عن الدوال الأخرى التي تتأثر بالوقت.
لإتاحة إعداد monorepo على هذا النحو، حدِّد إعدادات وظائف متعددة
في firebase.json
:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
باستخدام هذا الإعداد، تنشر واجهة سطر الأوامر (CLI) في Firebase الدوال من جميع الحِزم في أمر نشر واحد:
$ 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، يمكنك وضع الدوال القليلة الأولى في ملف واحد:
index.js
const functions = require('firebase-functions/v1');
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!")
وقد يصعب إدارة ذلك عند استخدام أكثر من بضع دوال. بدلاً من ذلك، يمكنك وضع جميع التعليمات البرمجية لكل دالة في ملف منفصل واستخدام ملف المصدر كقائمة بعمليات التصدير:
Node.js
foo.js
const functions = require('firebase-functions/v1'); exports.foo = functions.https.onRequest((request, response) => { // ... });
bar.js
const functions = require('firebase-functions/v1'); 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 *
يفترض هذا الإعداد بنية دليل مشروع على النحو التالي:
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
:
index.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، يُرجى الاطّلاع على: