| בחירת שפה: | Node.js Python |
פונקציה ב-Cloud Functions יכולה להשתמש במודולים חיצוניים ובתלויות מקומיות. הדרך שבה מציינים ומנהלים תלויות משתנה בהתאם לשפת זמן הריצה.
Node.js
פונקציה יכולה להשתמש במודולים חיצוניים של Node.js וגם בנתונים מקומיים. התלויות ב-Node.js מנוהלות באמצעות npm ומופיעות בקובץ מטא-נתונים שנקרא package.json. סביבות זמן הריצה של Node.js ב-Cloud Functions תומכות בהתקנה באמצעות npm, yarn או pnpm.
כדי לציין תלות בפונקציה, מוסיפים אותה לקובץ package.json.
בדוגמה הזו, תלות מפורטת בקובץ package.json:
{ "dependencies": { "escape-html": "^1.0.3" } }
לאחר מכן, התלות מיובאת בפונקציה:
JavaScript
const onRequest = require("firebase-functions/https");
const escapeHtml = require("escape-html");
// Return a greeting with the input HTML-escaped.
exports.hello = onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});
TypeScript
import { onRequest } from "firebase-functions/https";
import * as escapeHtml from "escape-html";
// Return a greeting with the input HTML-escaped.
export let hello = onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});
כולל מודולים מקומיים של Node.js
אפשר גם לכלול מודולים מקומיים של Node.js כחלק מהפונקציה. כדי לעשות את זה, צריך להצהיר על המודול ב-package.json באמצעות הקידומת file:. בדוגמה הבאה, mymodule הוא שם המודול ו-mymoduledir הוא הספרייה שמכילה את המודול:
{ "dependencies": { "mymodule": "file:mymoduledir" } }
הקוד של המודול המקומי הזה צריך להיות מאוחסן במקום אחר ולא בתיקייה node_modules שבספריית השורש של הפונקציה.
שלבים נוספים ל-TypeScript
השימוש ב-TypeScript הכי מועיל כשמשתמשים בספריות שיש בהן מידע על סוגים.
כך TypeScript יכולה לזהות שגיאות תחביר, ועורכי קוד יכולים לתת לכם הצעות טובות יותר להשלמה אוטומטית. חלק מהספריות, כמו firebase-admin ו-firebase-functions, מגיעות עם הגדרות TypeScript.
הרבה ספריות לא מספקות הגדרת TypeScript משלהן. במסגרת הפרויקט DefinitelyTyped, הקהילה מספקת הגדרות של ספריות הצמתים הפופולריות ביותר.
DefinitelyTyped מפרסמת את ההגדרות האלה באותו שם חבילת NPM, אבל בתוך הארגון '@types'. לדוגמה, אפשר להתקין את פרטי הסוג של הספרייה uuid באמצעות הפקודה הבאה:
npm install @types/uuid
כשתתחילו להכיר את TypeScript יותר טוב, יכול להיות שתחליטו לשלב בין שתי ההתקנות:
npm install uuid @types/uuid
סוג התלות צריך להיות זהה לסוג התלות בספרייה. לדוגמה, לא כדאי לשמור את uuid כתלות רגילה ואת @types/uuid כתלות לפיתוח או כתלות עמיתים.
טעינת מודולים של Node.js
משתמשים בפונקציה Node.js
require()
כדי לטעון כל מודול Node.js שהתקנתם. אפשר גם להשתמש בפונקציה require() כדי לייבא קבצים מקומיים שאתם פורסים לצד הפונקציה.
אם אתם כותבים פונקציות ב-TypeScript, אתם יכולים להשתמש בהצהרה import באותו אופן כדי לטעון כל מודול Node.js שהתקנתם.
שימוש במודולים פרטיים
כדי להשתמש במודול npm פרטי, צריך לספק הגדרות לאימות עם המאגר בקובץ .npmrc בספרייה של הפונקציה. אם אתם משתמשים ב-Yarn בגרסה 2 ומעלה כמנהל החבילות, שם הקובץ הוא .yarnrc.yml.
מודולים פרטיים מ-Artifact Registry
מאגר חבילות Node.js ב-Artifact Registry יכול לארח מודולים פרטיים של הפונקציה. כשפורסים פונקציה של Google Cloud Functions, תהליך ה-build יוצר באופן אוטומטי פרטי כניסה ל-Artifact Registry עבור חשבון השירות ב-Cloud Build.
צריך לכלול רק את המאגר של Artifact Registry ב-.npmrc בלי ליצור פרטי כניסה נוספים. לדוגמה:
@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true
הגישה הזו פועלת גם במנהל החבילות Yarn v1.
אם אתם משתמשים ב-Yarn בגרסה 2 ומעלה, אתם צריכים רק לציין את מאגר Artifact Registry ב-.yarnrc.yml בלי פרטי כניסה נוספים.
לדוגמה:
npmScopes:
SCOPE:
npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
npmAlwaysAuth: true
מודולים פרטיים ממאגרים אחרים
במסמכי התיעוד של npm מוסבר איך ליצור אסימוני גישה בהתאמה אישית לקריאה בלבד. אנחנו לא ממליצים להשתמש בקובץ .npmrc שנוצר בספריית הבית כי הוא מכיל טוקן לקריאה ולכתיבה. הרשאות כתיבה לא נדרשות במהלך הפריסה, והן עלולות לסכן את האבטחה.
אם אתם לא משתמשים במאגרים פרטיים, אל תכללו את הקובץ .npmrc, כי הוא עלול להאריך את זמן הפריסה של הפונקציות.
פורמט קובץ
אם אתם משתמשים בקובץ .npmrc כדי להגדיר אסימון אימות בהתאמה אישית, הוא צריך לכלול את השורה שמוצגת למטה.
//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN
מחליפים את:
- REGISTRY_DOMAIN: שם הדומיין של מאגר npm הפרטי. אם המאגר מתארח ב-
npmjs.org, צריך להגדיר את השדה הזה לערךregistry.npmjs.org. AUTH_TOKEN: אסימון ההרשאה של מאגר npm. זה יכול להיות ערך הטקסט המילולי של הטוקן או מחרוזת הטקסט
${NPM_TOKEN}, שמוחלפת על ידיnpmבערך הטוקן בפועל מהסביבה.אפשר להגדיר את משתנה הסביבה
$NPM_TOKENבאמצעות הארגומנט--set-build-env-varsבפקודהgcloud functions deploy. לפרטים נוספים על טוקן האימות של NPM, אפשר לעיין במדריך NPM בנושא מודולים פרטיים.
Python
יש שתי דרכים לציין יחסי תלות עבור Cloud Functions שנכתבו ב-Python: שימוש בקובץ requirements.txt של מנהל החבילות pip או אריזה של יחסי תלות מקומיים לצד הפונקציה.
אין תמיכה בציון יחסי תלות באמצעות התקן Pipfile/Pipfile.lock. הפרויקט לא צריך לכלול את הקבצים האלה.
ציון יחסי תלות באמצעות PIP
יחסי תלות ב-Python מנוהלים באמצעות pip ומפורטים בקובץ מטא-נתונים שנקרא requirements.txt.
הקובץ הזה צריך להיות באותה ספרייה שבה נמצא קובץ main.py שמכיל את קוד הפונקציה.
כשפורסים או פורסים מחדש את הפונקציה, Cloud Functions משתמש ב-pip כדי להוריד ולהתקין את הגרסה האחרונה של התלויות שמוצהרות בקובץ requirements.txt.
הקובץ requirements.txt מכיל שורה אחת לכל חבילה. כל שורה מכילה את שם החבילה, ואת הגרסה המבוקשת (אופציונלי). פרטים נוספים זמינים במקור המידע requirements.txt.
כדי למנוע השפעה של שינויים בגרסת התלות על ה-build, כדאי להצמיד את חבילות התלות לגרסה ספציפית.
קובץ requirements.txt לדוגמה:
functions-framework requests==2.20.0 numpy
אריזה של יחסי תלות מקומיים
אפשר גם לארוז ולפרוס תלויות לצד הפונקציה. הגישה הזו שימושית אם התלות לא זמינה דרך מנהל החבילות pip או אם הגישה לאינטרנט בסביבת Cloud Functions מוגבלת.
לדוגמה, אפשר להשתמש במבנה ספריות כמו זה:
myfunction/
├── main.py
└── localpackage/
├── __init__.py
└── script.py
אחר כך תוכלו לייבא את הקוד כרגיל מ-localpackage באמצעות ההצהרה הבאה
import.
# Code in main.py from localpackage import script
חשוב לדעת: בגישה הזו, קבצי setup.py לא יפעלו. עדיין אפשר לארוז חבילות עם הקבצים האלה, אבל יכול להיות שהן לא יפעלו בצורה תקינה ב-Cloud Functions.