درحال رسیدگی به وابستگی‌ها

انتخاب زبان: Node.js Python

تابع Cloud Functions می‌تواند از ماژول‌های خارجی و وابستگی‌های محلی استفاده کند. نحوه مشخص کردن و مدیریت وابستگی‌ها به زبان زمان اجرای شما بستگی دارد.

Node.js

تابع می‌تواند از ماژول‌های Node.js خارجی و همچنین داده‌های محلی استفاده کند. وابستگی‌ها در Node.js با npm مدیریت می‌شوند و در یک فایل فراداده به‌نام package.json بیان می‌شوند. زمان‌های اجرای Node.js در «توابع ابری» از نصب بااستفاده از npm،‏ yarn، یا pnpm پشتیبانی می‌کنند.

برای مشخص کردن وابستگی برای تابع، آن را به فایل package.json اضافه کنید.

در این مثال، وابستگی در فایل package.json فهرست شده است:

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

سپس وابستگی در تابع وارد می‌شود:

جاوا اسکریپت

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 که نصب کرده‌اید استفاده کنید.

استفاده از ماژول‌های خصوصی

می‌توانید با ارائه تنظیمات برای اصالت‌سنجی با دفتر ثبت در فایل .npmrc در دایرکتوری تابع، از ماژول npm خصوصی استفاده کنید. اگر از Yarn نسخه ۲ یا بالاتر به‌عنوان مدیر بسته‌تان استفاده می‌کنید، نام این فایل .yarnrc.yml است.

مدول‌های خصوصی از Artifact Registry

مخزن بسته Artifact Registry Node.js می‌تواند میزبان واحدهای خصوصی برای تابع شما باشد. وقتی تابع Google Cloud Functions را مستقر می‌کنید، فرایند ساخت به‌طور خودکار اطلاعات اعتباری 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 نسخه ۲ یا بالاتر استفاده می‌کنید، فقط باید مخزن 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 درباره واحدهای خصوصی را ببینید.


پایتون

دو روش برای مشخص کردن وابستگی‌های 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 را ببینید.

برای جلوگیری از تحت‌تأثیر قرار گرفتن ساخت شما توسط تغییرات نسخه وابستگی، بسته‌های وابستگی خود را به یک نسخه خاص پین کنید.

در زیر نمونه‌ای از فایل 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 اجرا نشوند.