ארגן מספר פונקציות


כאשר אתה משלב פונקציות ענן בפרויקט שלך, הקוד שלך יכול להתרחב ולהכיל פונקציות עצמאיות רבות. ייתכן שיש לך יותר מדי פונקציות מכדי להתאים באופן סביר לקובץ בודד, או שצוותים שונים עשויים לפרוס קבוצות שונות של פונקציות, מה שיוצר סיכון שצוות אחד יחליף או ימחק בטעות פונקציות של צוות אחר. 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 נתמך ב-Firebase CLI v10.7.1 ומעלה.

ניהול מספר מאגרים

המאפיין codebase יכול לעזור לפשט את הניהול של מאגרים מרובים. הבה נבחן מקרה שבו יש לך שני מאגרים שונים הפורסים פונקציות לאותו פרויקט Firebase:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

ללא הערות בסיס קוד, ה-CLI של 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"
}

עם הערת בסיס קוד, ה-CLI של 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!

ניהול מספר חבילות מקור (monorepo)

המאפיין codebase יכול לעזור לפשט את הניהול של מספר חבילות מקור במאגר יחיד. הבה נבחן מקרה שבו יש לך ספריית פרויקטים של Firebase עם הגדרות פונקציות הפרוסות על פני מספר חבילות משנה:

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

הגדרה זו מתאימה למקרי השימוש הבאים:

  • יש לך הגדרת monorepo וצוותים שונים מנהלים את הגדרות הפונקציה שלהם בחבילה מבודדת.
  • יש לך פונקציה עם תלות חיצונית כבדה ואתחול ארוך טווח, ואתה רוצה לבודד את הפונקציה הזו מפונקציות אחרות הרגישות לזמן השהייה.

כדי לתמוך בהגדרת 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)...
...

כתוב פונקציות במספר קבצים

כשאתה מתחיל עם פונקציות ענן, אתה עשוי לשים את הפונקציות הראשונות שלך בקובץ אחד:

index.js

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

פִּיתוֹן

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

הצעדים הבאים

למידע נוסף על פונקציות ענן, ראה: