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


عند دمج 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 يطلب منك حذف الدوال المحددة في المستودع الآخر وقت النشر:

$ (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 الحذف الدوال المحددة خارج مستودعك المباشر:

$ (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!

إدارة حزم مصادر متعددة (Monrepo)

يمكن أن تساعد السمة codebase في تبسيط عملية إدارة مصادر متعدّدة. الحزم في مستودع واحد. لنراجع حالة يكون لديك فيها Firebase دليل المشروع مع تعريفات الدوال موزعة على عدة حزم فرعية:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

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

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

لدعم إعداد monrepo مثل هذا، حدد تكوينات متعددة للدوال في firebase.json:

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

باستخدام هذه الإعدادات، ينشر واجهة سطر الأوامر في 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');
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!")

قد يصبح من الصعب إدارة هذا بأكثر من بضع وظائف. بدلاً من ذلك، يمكنك وضع كل منطقك لكل دالة في ملفها الخاص واستخدام ملف المصدر كقائمة بعمليات التصدير:

Node.js

foo.js

const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js

const functions = require('firebase-functions');
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');
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

الخطوات التالية

لمزيد من المعلومات حول دوال السحابة، يُرجى الاطّلاع على: