تنظيم دوال متعددة (الجيل الأول)

عند دمج 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 والإصدارات الأحدث.

إدارة مستودعات متعددة

يمكن أن تساعد السمة 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

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

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

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