לפני שמקשרים את האפליקציה לאמולטור Cloud Functions, חשוב לוודא שמבינים את תהליך העבודה הכולל של Firebase Local Emulator Suite, שהתקנתם והגדרתם את Local Emulator Suite ושבדקתם את פקודות ה-CLI שלו.
בחירת פרויקט ב-Firebase
Firebase Local Emulator Suite מדמה מוצרים לפרויקט Firebase יחיד.
כדי לבחור את הפרויקט שבו רוצים להשתמש, לפני שמפעילים את האמולטורים, מריצים את הפקודה firebase use בספריית העבודה. אפשר גם להעביר את הדגל --project לכל פקודת אמולטור.
Local Emulator Suite תומך באמולציה של פרויקטים אמיתיים ב-Firebase ושל פרויקטים לדוגמה.
| סוג הפרויקט | תכונות | שימוש באמולטורים |
|---|---|---|
| Real |
פרויקט Firebase אמיתי הוא פרויקט שיצרתם והגדרתם (סביר להניח שבאמצעות Firebaseהמסוף). בפרויקטים אמיתיים יש משאבים פעילים, כמו מופעים של מסדי נתונים, קטגוריות אחסון, פונקציות או כל משאב אחר שהגדרתם לפרויקט הזה ב-Firebase. |
כשעובדים עם פרויקטים אמיתיים ב-Firebase, אפשר להפעיל אמולטורים לכל המוצרים הנתמכים או לחלק מהם. לכל המוצרים שאתם לא מדמים, האפליקציות והקוד שלכם יפעלו עם משאב פעיל (מופע של מסד נתונים, קטגוריית אחסון, פונקציה וכו'). |
| הדגמה |
לפרויקט הדגמה ב-Firebase אין הגדרה אמיתית של Firebase ואין לו משאבים פעילים. בדרך כלל ניגשים לפרויקטים האלה באמצעות הדרכות של Codelab או מדריכים אחרים. מזהי פרויקטים של פרויקטים לדוגמה מתחילים בקידומת |
כשעובדים עם הדגמות של פרויקטים ב-Firebase, האפליקציות והקוד מקיימים אינטראקציה רק עם אמולטורים. אם האפליקציה מנסה ליצור אינטראקציה עם משאב שלא מופעל בו אמולטור, הקוד ייכשל. |
מומלץ להשתמש בפרויקטים לדוגמה ככל האפשר. ההטבות כוללות:
- ההגדרה קלה יותר, כי אפשר להריץ את האמולטורים בלי ליצור פרויקט Firebase
- רמת בטיחות גבוהה יותר, כי אם הקוד שלכם מפעיל בטעות משאבים לא מדומיים (בסביבת ייצור), אין סיכוי לשינוי נתונים, לשימוש ולחיוב
- תמיכה טובה יותר במצב אופליין, כי אין צורך לגשת לאינטרנט כדי להוריד את הגדרות ה-SDK.
הגדרת האפליקציה לתקשורת עם האמולטורים
הגדרת האפליקציה לפונקציות שאפשר להפעיל
אם פעילויות האב-טיפוס והבדיקה שלכם כוללות פונקציות backend שאפשר להפעיל, צריך להגדיר את האינטראקציה עם האמולטור Cloud Functions for Firebase באופן הבא:
Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. val functions = Firebase.functions functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseFunctions functions = FirebaseFunctions.getInstance(); functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useEmulator(withHost: "localhost", port: 5001)
Web
import { getApp } from "firebase/app"; import { getFunctions, connectFunctionsEmulator } from "firebase/functions"; const functions = getFunctions(getApp()); connectFunctionsEmulator(functions, "127.0.0.1", 5001);
Web
firebase.functions().useEmulator("127.0.0.1", 5001);
הטמעה של פונקציות HTTPS באפליקציה
כל פונקציית HTTPS בקוד שלכם תוצג מהאמולטור המקומי באמצעות פורמט כתובת ה-URL הבא:
http://$HOST:$PORT/$PROJECT/$REGION/$NAME
לדוגמה, פונקציה פשוטה helloWorld עם יציאת המארח והאזור שמוגדרים כברירת מחדל תפעל בכתובת:
https://localhost:5001/$PROJECT/us-central1/helloWorld
הגדרת האפליקציה לצורך הדמיה של פונקציות של תור משימות
האמולטור מגדיר אוטומטית תורים של משימות מדומה על סמך הגדרות של טריגרים, ו-Admin SDK מעביר בקשות שהוכנסו לתור לאמולטור אם הוא מזהה שהוא פועל דרך משתנה הסביבה CLOUD_TASKS_EMULATOR_HOST.
שימו לב שמערכת השליחה שמשמשת בסביבת הייצור מורכבת יותר מזו שהוטמעה באמולטור, ולכן לא כדאי לצפות שההתנהגות המדומה תשקף במדויק את סביבות הייצור. הפרמטרים בתוך האמולטור מספקים גבולות עליונים לקצב שבו המשימות נשלחות ומבוצע ניסיון חוזר שלהן.
הגדרת האפליקציה להדמיה של פונקציות שמופעלות ברקע
האמולטור של Cloud Functions תומך בפונקציות שמופעלות ברקע מהמקורות הבאים:
- אמולטור Realtime Database
- אמולטור Cloud Firestore
- אמולטור Authentication
- אמולטור Pub/Sub
- אמולטור של התראות ב-Firebase
כדי להפעיל אירועים ברקע, צריך לשנות את משאבי ה-back-end באמצעות התג Emulator Suite UI, או על ידי חיבור האפליקציה או קוד הבדיקה לאמולטורים באמצעות ה-SDK של הפלטפורמה.
בדיקת רכיבי handler לאירועים מותאמים אישית שמופקים על ידי תוספים
בפונקציות שמטפלות בFirebase Extensions אירועים מותאמים אישית עם Cloud Functions v2, האמולטור של Cloud Functions משויך לאמולטור של Eventarc כדי לתמוך בטריגרים של Eventarc.
כדי לבדוק את ה-handlers של אירועים בהתאמה אישית לתוספים ששולחים אירועים, צריך להתקין את Cloud Functions ואת אמולטור Eventarc.
זמן הריצה Cloud Functions מגדיר את משתנה הסביבה EVENTARC_EMULATOR לערך localhost:9299 בתהליך הנוכחי אם האמולטור של Eventarc פועל. ה-Firebase Admin SDK מתחברים אוטומטית לאמולטור Eventarc כשמשתנה הסביבה EVENTARC_EMULATOR מוגדר. אפשר לשנות את יציאת ברירת המחדל כמו שמוסבר בקטע הגדרת Local Emulator Suite.
כשמשתני הסביבה מוגדרים בצורה נכונה, המערכת Firebase Admin SDK שולחת אוטומטית אירועים לאמולטור Eventarc. בתמורה, האמולטור של Eventarc מבצע קריאה חזרה לאמולטור של Cloud Functions כדי להפעיל את כל ה-handlers הרשומים.
אפשר לבדוק את היומנים של Functions ב-Emulator Suite UI כדי לקבל פרטים על הביצוע של handler.
הגדרת סביבת בדיקה מקומית
אם הפונקציות שלכם מסתמכות על הגדרת סביבה מבוססת dotenv, אתם יכולים לחקות את ההתנהגות הזו בסביבת הבדיקה המקומית.
כשמשתמשים באמולטור מקומי Cloud Functions, אפשר להגדיר קובץ .env.local כדי לשנות את משתני הסביבה של הפרויקט. התוכן של .env.local מקבל עדיפות על פני .env וקובץ .env הספציפי לפרויקט.
לדוגמה, פרויקט יכול לכלול את שלושת הקבצים האלה עם ערכים שונים במקצת לפיתוח ולבדיקות מקומיות:
.env
|
.env.dev
|
.env.local
|
| PLANET=Earth
קהל=בני אדם |
AUDIENCE=Dev Humans | קהל=אנשים מקומיים |
כשמפעילים את האמולטור בהקשר המקומי, הוא טוען את משתני הסביבה כמו שמוצג:
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
סודות ופרטי כניסה באמולטור של Cloud Functions
Cloud Functionsהאמולטור תומך בשימוש בסודות כדי לאחסן מידע רגיש על הגדרות ולגשת אליו. כברירת מחדל, האמולטור ינסה לגשת לסודות שלכם בסביבת הייצור באמצעות פרטי כניסה שמוגדרים כברירת מחדל לאפליקציה. במצבים מסוימים, כמו בסביבות CI, יכול להיות שהאמולטור לא יוכל לגשת לערכי סודות בגלל הגבלות הרשאה.
בדומה לתמיכה של אמולטור Cloud Functions במשתני סביבה, אפשר להגדיר קובץ .secret.local כדי לבטל את הערכים של הסודות. כך תוכלו לבדוק את הפונקציות באופן מקומי בקלות, במיוחד אם אין לכם גישה לערך הסודי.
אילו כלים אחרים לבדיקה של Cloud Functions קיימים?
האמולטור Cloud Functions משלים את כלי האב-טיפוס והבדיקה האחרים:
- מעטפת Cloud Functions, שמאפשרת יצירת אב טיפוס ופיתוח של פונקציות אינטראקטיביות ואיטרטיביות. המעטפת משתמשת באמולטור של Cloud Functions עם ממשק בסגנון REPL לפיתוח. אין שילוב עם אמולטורים של Cloud Firestore או Realtime Database. באמצעות המעטפת, אפשר ליצור נתוני דמה ולבצע קריאות לפונקציות כדי לדמות אינטראקציה עם מוצרים שLocal Emulator Suite לא תומך בהם כרגע: Analytics, Remote Config ו-Crashlytics.
- Firebase Test SDK for Cloud Functions, Node.js עם מסגרת mocha לפיתוח פונקציות. למעשה, ערכת ה-SDK לבדיקה של Cloud Functions מספקת אוטומציה מעל מעטפת Cloud Functions.
מידע נוסף על מעטפת Cloud Functions ועל Cloud Functions Test SDK זמין במאמרים בדיקת פונקציות באופן אינטראקטיבי ובדיקות יחידה של Cloud Functions.
ההבדלים בין Cloud Functions האמולטור לבין הסביבה הפרודקטיבית
האמולטור Cloud Functions די דומה לסביבת הייצור ברוב תרחישי השימוש. השקענו מאמצים רבים כדי לוודא שהכול בסביבת זמן הריצה של Node יהיה כמה שיותר קרוב לסביבת הייצור. עם זאת, האמולטור לא מחקה את סביבת הייצור המלאה שמבוססת על קונטיינרים, ולכן קוד הפונקציה יפעל בצורה ריאליסטית, אבל היבטים אחרים של הסביבה (למשל, קבצים מקומיים, התנהגות אחרי קריסת הפונקציות וכו') יהיו שונים.
Cloud IAM
הכלים לאמולטור מקומי ב-Firebase לא מנסים לשכפל או להתייחס להתנהגות שקשורה ל-IAM בזמן ההפעלה. האמולטורים פועלים בהתאם לכללי האבטחה שסופקו ב-Firebase, אבל במצבים שבהם בדרך כלל נעשה שימוש ב-IAM, למשל כדי להגדיר חשבון שירות להפעלת Cloud Functions וכך גם הרשאות, אי אפשר להגדיר את האמולטור והוא ישתמש בחשבון שזמין באופן גלובלי במחשב של המפתח, בדומה להרצה ישירה של סקריפט מקומי.
הגבלות על זיכרון ומעבד
האמולטור לא אוכף הגבלות על זיכרון או על מעבד עבור הפונקציות שלכם. עם זאת, האמולטור תומך בפונקציות של פסק זמן באמצעות הארגומנט של זמן הריצה timeoutSeconds.
שימו לב: זמן ההפעלה של הפונקציה עשוי להיות שונה מהזמן שנדרש להפעלה בסביבת הייצור, כשמריצים פונקציות באמולטור. מומלץ, אחרי שתכננתם ובדקתם פונקציות באמצעות האמולטור, להריץ בדיקות מוגבלות בסביבת הייצור כדי לוודא את זמני הביצוע.
תכנון ההבדלים בין סביבות מקומיות וסביבות ייצור
מכיוון שהאמולטור פועל במחשב המקומי, הוא תלוי בסביבה המקומית שלכם לצורך הפעלת אפליקציות, תוכנות ושירותים מובנים.
חשוב לדעת שהסביבה המקומית לפיתוח Cloud Functions עשויה להיות שונה מסביבת הייצור של Google:
ההתנהגות של אפליקציות שמתקינים באופן מקומי כדי לדמות את סביבת הייצור (למשל, ImageMagick מהמדריך הזה) עשויה להיות שונה מההתנהגות בסביבת הייצור, במיוחד אם נדרשות גרסאות שונות או אם הפיתוח מתבצע בסביבה שאינה Linux. כדאי לפרוס עותק בינארי משלכם של התוכנית החסרה לצד פריסת הפונקציה.
באופן דומה, יכול להיות שיהיה הבדל בין כלי עזר מובנים (למשל, פקודות shell כמו
ls,mkdir) לבין הגרסאות שזמינות בסביבת הייצור, במיוחד אם אתם מפתחים בסביבה שהיא לא Linux (למשל, macOS). כדי לפתור את הבעיה הזו, אפשר להשתמש בחלופות שמבוססות על Node בלבד לפקודות מקוריות, או ליצור קבצים בינאריים של Linux כדי לאגד אותם עם הפריסה.
מנסה שוב
האמולטור של Cloud Functions לא תומך בניסיון חוזר להפעיל פונקציות במקרה של כשל.
מה הלאה?
- כדי לראות אוסף של סרטונים ודוגמאות מפורטות, אפשר לעיין בפלייליסט ההדרכה בנושא Firebase Emulators.
- Cloud Functions for Firebaseמידע נוסף על האמולטור זמין במאמר הרצת פונקציות באופן מקומי.