عند دمج Cloud Functions في مشروعك، يمكن أن تتوسع التعليمات البرمجية لتشمل العديد من الدوال المستقلة. قد يكون لديك عدد كبير جدًا من الدوال بحيث لا يمكن وضعها في ملف واحد، أو قد تنشر فِرق مختلفة مجموعات مختلفة من الدوال، ما يؤدي إلى خطر استبدال فريق لدوال فريق آخر أو حذفها عن طريق الخطأ. توفّر Cloud Functions طرقًا مختلفة لتنظيم التعليمات البرمجية لتسهيل التنقّل بين الدوال وصيانتها.
تنظيم الدوال في قواعد التعليمات البرمجية
يمكنك استخدام السمة codebase لكائن ضبط الدوال في firebase.json لإدارة مجموعة كبيرة من الدوال في مستودعات متعددة أو حِزم فرعية ضمن إعداد مستودع واحد متعدد المشاريع:
# 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 من Firebase CLI والإصدارات الأحدث.
إدارة مستودعات متعددة
يمكن أن تساعد السمة 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!
إدارة حِزم مصدر متعددة (مستودع واحد متعدد المشاريع)
يمكن أن تساعد السمة codebase في تبسيط إدارة حِزم مصدر متعددة في مستودع واحد. لنلقِ نظرة على حالة لديك فيها دليل مشروع Firebase يتضمّن تعريفات الدوال موزّعة على عدة حِزم فرعية:
$ tree .
├── firebase.json
├── teamA
│ ├── index.js
│ └── package.json
└── teamB
├── index.js
└── package.json
يناسب هذا الإعداد حالات الاستخدام التالية:
- لديك إعداد مستودع واحد متعدد المشاريع وتدير فِرق مختلفة تعريفات الدوال الخاصة بها في حزمة معزولة.
- لديك دالة تعتمد بشكل كبير على تبعية خارجية وتستغرق وقتًا طويلاً لإعدادها، وتريد عزل هذه الدالة عن الدوال الأخرى التي تتأثر بوقت الاستجابة.
لدعم إعداد مستودع واحد متعدد المشاريع على هذا النحو، حدِّد عمليات ضبط متعددة للدوال في firebase.json:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
باستخدام هذا الضبط، ينشر Firebase CLI الدوال من جميع الحِزم في أمر نشر واحد:
$ 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، يُرجى الاطّلاع على: