تنظيم الدوال المتعددة


أثناء دمج 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

يناسب هذا الإعداد حالات الاستخدام التالية:

  • إذا كان لديك إعداد مستودع موحّد ولديك فِرق مختلفة تدير تعريفات الدوال الخاصة بها في حزمة معزولة
  • لديك دالة ذات اعتمادية خارجية كبيرة ومدة إعداد طويلة، وتريد عزل هذه الدالة عن الدوال الأخرى الحساسة للوقت المستغرَق في المعالجة.

لدعم إعداد monrepo على هذا النحو، حدِّد إعدادات دوال متعددة في 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، يُرجى الاطّلاع على: