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

انتخاب زبان: 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"
  }
}

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

جاوا اسکریپت

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

مخزن بسته 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 v2 یا بالاتر استفاده می‌کنید، فقط باید مخزن 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 وجود دارد: استفاده از مدیر بسته pip requirements.txt یا بسته‌بندی وابستگی‌های محلی همراه با تابع.

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