| בחירת שפה: | 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 יש הגדרות שמתוחזקות על ידי הקהילה לספריות הפופולריות ביותר של Node.
ב-DefinitelyTyped, ההגדרות האלה מתפרסמות תחת אותו שם חבילת NPM, אבל בתוך הארגון "@types". לדוגמה, אפשר להתקין את פרטי הסוג של הספרייה uuid באמצעות:
npm install @types/uuid
ככל שתכירו יותר את TypeScript, יכול להיות שתשלבו בין שתי ההתקנות:
npm install uuid @types/uuid
התלות בסוגים צריכה להיות מאותו סוג כמו התלות בספרייה. לדוגמה, אל תשמרו את uuid כתלות רגילה ואת @types/uuid כתלות בפיתוח או כתלות בעמיתים.
טעינת מודולים של Node.js
משתמשים בפונקציה require() של Node.js כדי לטעון כל מודול של 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.