| اختيار اللغة: | 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
استخدِم دالة 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 ، تنشئ عملية التصميم تلقائيًا بيانات اعتماد 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 الإصدار 1.
إذا كنت تستخدم 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: استخدام ملف 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.