رسیدگی به وابستگی ها

انتخاب زبان: پایتون در Node.js

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

نود جی اس

یک تابع مجاز است از ماژول‌های خارجی 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")}!`);
});

تایپ اسکریپت

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

تایپ‌اسکریپت زمانی بیشترین کمک را به شما می‌کند که از کتابخانه‌هایی استفاده کنید که اطلاعات نوع دارند. این به تایپ‌اسکریپت اجازه می‌دهد خطاهای نحوی را تشخیص دهد و به ویرایشگرها اجازه می‌دهد پیشنهادهای تکمیل خودکار بهتری به شما ارائه دهند. برخی از کتابخانه‌ها، مانند firebase-admin و firebase-functions ، تعاریف تایپ‌اسکریپت را نیز شامل می‌شوند.

بسیاری از کتابخانه‌ها تعریف TypeScript مخصوص به خود را ارائه نمی‌دهند. پروژه CertainTyped تعاریفی را برای محبوب‌ترین کتابخانه‌های گره ارائه می‌دهد که توسط جامعه توسعه‌دهندگان نگهداری می‌شوند. CertainTyped این تعاریف را تحت همان نام بسته 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 که نصب کرده‌اید استفاده کنید.

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

شما می‌توانید با ارائه تنظیمات احراز هویت با رجیستری در یک فایل .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 نسخه ۱ نیز کار می‌کند. اگر از 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 نوشته شده در پایتون وجود دارد: استفاده از فایل requirements.txt در مدیریت بسته pip یا بسته‌بندی وابستگی‌های محلی در کنار تابع شما.

مشخصات وابستگی با استفاده از استاندارد Pipfile/Pipfile.lock پشتیبانی نمی‌شود. پروژه شما نباید شامل این فایل‌ها باشد.

تعیین وابستگی‌ها با pip

وابستگی‌ها در پایتون با 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 به درستی اجرا نشوند.