برنامه خود را به شبیه ساز توابع ابری متصل کنید

قبل از اتصال برنامه خود به شبیه‌ساز Cloud Functions ، مطمئن شوید که گردش کار کلی Firebase Local Emulator Suite را درک کرده‌اید ، و Local Emulator Suite را نصب و پیکربندی کرده‌اید و دستورات CLI آن را بررسی کرده‌اید.

یک پروژه فایربیس انتخاب کنید

Firebase Local Emulator Suite محصولات مربوط به یک پروژه فایربیس را شبیه‌سازی می‌کند.

برای انتخاب پروژه مورد استفاده، قبل از شروع شبیه‌سازها، در CLI firebase use در دایرکتوری کاری خود اجرا کنید. یا می‌توانید پرچم --project را به هر دستور شبیه‌ساز ارسال کنید.

Local Emulator Suite از شبیه‌سازی پروژه‌های واقعی Firebase و پروژه‌های آزمایشی پشتیبانی می‌کند.

نوع پروژه ویژگی‌ها استفاده با شبیه‌سازها
واقعی

یک پروژه واقعی Firebase، پروژه‌ای است که شما ایجاد و پیکربندی کرده‌اید (به احتمال زیاد از طریق کنسول Firebase ).

پروژه‌های واقعی منابع زنده‌ای دارند، مانند نمونه‌های پایگاه داده، مخازن ذخیره‌سازی، توابع یا هر منبع دیگری که برای آن پروژه Firebase تنظیم کرده‌اید.

هنگام کار با پروژه‌های واقعی Firebase، می‌توانید شبیه‌سازها را برای هر یا همه محصولات پشتیبانی‌شده اجرا کنید.

برای هر محصولی که شبیه‌سازی نمی‌کنید، برنامه‌ها و کد شما با منبع زنده (نمونه پایگاه داده، مخزن ذخیره‌سازی، تابع و غیره) تعامل خواهند داشت.

نسخه آزمایشی

یک پروژه آزمایشی فایربیس هیچ پیکربندی واقعی فایربیس و هیچ منبع زنده‌ای ندارد. این پروژه‌ها معمولاً از طریق codelabs یا سایر آموزش‌ها قابل دسترسی هستند.

شناسه‌های پروژه برای پروژه‌های نمایشی دارای پیشوند demo- هستند.

هنگام کار با پروژه‌های آزمایشی Firebase، برنامه‌ها و کد شما فقط با شبیه‌سازها تعامل دارند. اگر برنامه شما سعی کند با منبعی که شبیه‌ساز برای آن اجرا نمی‌شود، تعامل داشته باشد، آن کد با شکست مواجه خواهد شد.

توصیه می‌کنیم تا حد امکان از پروژه‌های نمایشی استفاده کنید. مزایا عبارتند از:

  • راه‌اندازی آسان‌تر، زیرا می‌توانید شبیه‌سازها را بدون ایجاد یک پروژه Firebase اجرا کنید
  • ایمنی قوی‌تر، زیرا اگر کد شما به‌طور تصادفی منابع شبیه‌سازی نشده (تولیدی) را فراخوانی کند، هیچ شانسی برای تغییر داده‌ها، استفاده و صدور صورتحساب وجود ندارد.
  • پشتیبانی آفلاین بهتر، زیرا نیازی به دسترسی به اینترنت برای دانلود پیکربندی SDK شما نیست.

برنامه خود را برای ارتباط با شبیه‌سازها آماده کنید

برنامه خود را برای توابع قابل فراخوانی، تجهیز کنید

اگر فعالیت‌های نمونه‌سازی و آزمایشی شما شامل توابع backend قابل فراخوانی است، تعامل با Cloud Functions for Firebase را به این صورت پیکربندی کنید:

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
سویفت
Functions.functions().useEmulator(withHost: "localhost", port: 5001)

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

برنامه خود را برای شبیه‌سازی توابع HTTPS آماده کنید

هر تابع HTTPS در کد شما با استفاده از قالب URL زیر از شبیه‌ساز محلی ارائه می‌شود:

http:// $HOST : $PORT / $PROJECT / $REGION / $NAME

برای مثال، یک تابع ساده helloWorld با پورت و منطقه میزبان پیش‌فرض در آدرس زیر ارائه می‌شود:

https://localhost:5001/ $PROJECT /us-central1/helloWorld

برنامه خود را برای شبیه‌سازی توابع صف وظایف، تجهیز کنید

شبیه‌ساز به طور خودکار صف‌های وظیفه شبیه‌سازی شده را بر اساس تعاریف تریگر تنظیم می‌کند و Admin SDK در صورت تشخیص اجرای درخواست‌های صف‌بندی شده از طریق متغیر محیطی CLOUD_TASKS_EMULATOR_HOST ، آنها را به سمت شبیه‌ساز تغییر مسیر می‌دهد.

توجه داشته باشید که سیستم اعزام مورد استفاده در محیط عملیاتی پیچیده‌تر از سیستم پیاده‌سازی شده در شبیه‌ساز است، بنابراین نباید انتظار داشته باشید که رفتار شبیه‌سازی شده دقیقاً منعکس‌کننده محیط‌های عملیاتی باشد. پارامترهای درون شبیه‌ساز، مرزهای بالایی را برای نرخ اعزام و تلاش مجدد وظایف فراهم می‌کنند.

اپلیکیشن خود را برای شبیه‌سازی توابع فعال‌شده در پس‌زمینه تجهیز کنید

شبیه‌ساز Cloud Functions از توابع فعال‌شده در پس‌زمینه از منابع زیر پشتیبانی می‌کند:

  • شبیه‌ساز Realtime Database
  • شبیه‌ساز Cloud Firestore
  • شبیه‌ساز Authentication
  • شبیه‌ساز Pub/Sub
  • شبیه‌ساز هشدارهای فایربیس

برای فعال کردن رویدادهای پس‌زمینه، منابع back-end را با استفاده از Emulator Suite UI یا با اتصال برنامه یا کد آزمایشی خود به شبیه‌سازها با استفاده از SDK مخصوص پلتفرم خود، تغییر دهید.

کنترل‌کننده‌های تست برای رویدادهای سفارشی منتشر شده توسط افزونه‌ها

برای توابعی که برای مدیریت رویدادهای سفارشی Firebase Extensions با Cloud Functions v2 پیاده‌سازی می‌کنید، شبیه‌ساز Cloud Functions با شبیه‌ساز Eventarc جفت می‌شود تا از triggerهای Eventarc پشتیبانی کند.

برای آزمایش کنترل‌کننده‌های رویداد سفارشی برای افزونه‌هایی که رویدادها را منتشر می‌کنند، باید شبیه‌سازهای Cloud Functions و Eventarc را نصب کنید.

اگر شبیه‌ساز Eventarc در حال اجرا باشد، زمان اجرای Cloud Functions متغیر محیطی EVENTARC_EMULATOR را در فرآیند فعلی روی localhost:9299 تنظیم می‌کند. Firebase Admin SDK به طور خودکار هنگام تنظیم متغیر محیطی EVENTARC_EMULATOR به شبیه‌ساز Eventarc متصل می‌شوند. می‌توانید پورت پیش‌فرض را همانطور که در بخش پیکربندی Local Emulator Suite بحث شده است، تغییر دهید.

وقتی متغیرهای محیطی به درستی پیکربندی شوند، Firebase Admin SDK به طور خودکار رویدادها را به شبیه‌ساز Eventarc ارسال می‌کند. در عوض، شبیه‌ساز Eventarc برای راه‌اندازی هرگونه هندلر ثبت‌شده، به شبیه‌ساز Cloud Functions فراخوانی مجدد انجام می‌دهد.

برای جزئیات بیشتر در مورد اجرای هندلر، می‌توانید لاگ‌های توابع را در Emulator Suite UI بررسی کنید.

پیکربندی یک محیط آزمایش محلی

اگر توابع شما به پیکربندی محیط مبتنی بر dotenv متکی هستند، می‌توانید آن رفتار را در محیط تست محلی خود شبیه‌سازی کنید.

هنگام استفاده از یک شبیه‌ساز محلی Cloud Functions ، می‌توانید با تنظیم یک فایل .env.local ، متغیرهای محیطی را برای پروژه خود لغو کنید. محتویات .env.local بر .env و فایل .env مخصوص پروژه اولویت دارد.

برای مثال، یک پروژه می‌تواند شامل این سه فایل باشد که مقادیر کمی متفاوت برای توسعه و آزمایش محلی دارند:

.env .env.dev .env.local
سیاره = زمین

مخاطب = انسان‌ها

مخاطب= توسعه‌دهندگان انسان مخاطب = افراد محلی

وقتی شبیه‌ساز در زمینه محلی شروع به کار می‌کند، متغیرهای محیطی را مطابق شکل زیر بارگذاری می‌کند:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

اسرار و اعتبارنامه‌ها در شبیه‌ساز Cloud Functions

شبیه‌ساز Cloud Functions از استفاده از رمزها برای ذخیره و دسترسی به اطلاعات پیکربندی حساس پشتیبانی می‌کند. به طور پیش‌فرض، شبیه‌ساز سعی می‌کند با استفاده از اعتبارنامه‌های پیش‌فرض برنامه به رمزهای عملیاتی شما دسترسی پیدا کند. در شرایط خاص مانند محیط‌های CI، ممکن است شبیه‌ساز به دلیل محدودیت‌های مجوز، نتواند به مقادیر رمز دسترسی پیدا کند.

مشابه پشتیبانی شبیه‌ساز Cloud Functions برای متغیرهای محیطی، می‌توانید با تنظیم یک فایل .secret.local مقادیر secrets را لغو کنید. این کار آزمایش توابع شما را به صورت محلی آسان می‌کند، به خصوص اگر به مقدار secret دسترسی ندارید.

چه ابزارهای دیگری برای آزمایش Cloud Functions وجود دارد؟

شبیه‌ساز Cloud Functions توسط سایر ابزارهای نمونه‌سازی و آزمایش تکمیل می‌شود:

  • پوسته توابع ابری (Cloud Functions shell)، که امکان نمونه‌سازی و توسعه توابع تعاملی و تکراری را فراهم می‌کند. این پوسته از شبیه‌ساز توابع ابری با رابط کاربری به سبک REPL برای توسعه استفاده می‌کند. هیچ ادغامی با شبیه‌سازهای Cloud Firestore یا Realtime Database ارائه نمی‌شود. با استفاده از این پوسته، شما داده‌ها را شبیه‌سازی می‌کنید و فراخوانی‌های تابع را برای شبیه‌سازی تعامل با محصولاتی که Local Emulator Suite در حال حاضر از آنها پشتیبانی نمی‌کند، انجام می‌دهید: Analytics، Remote Config و Crashlytics.
  • کیت توسعه نرم‌افزار Firebase Test برای توابع ابری، یک چارچوب Node.js با mocha برای توسعه توابع. در واقع، کیت توسعه نرم‌افزار Cloud Functions Test، اتوماسیون را در پوسته Cloud Functions فراهم می‌کند.

می‌توانید اطلاعات بیشتری در مورد پوسته Cloud Functions و SDK تست Cloud Functions را در Test functions interactively و Unit testing of Cloud Functions بیابید.

تفاوت شبیه‌ساز Cloud Functions با نسخه اصلی

شبیه‌ساز Cloud Functions در اکثر موارد استفاده، نسبتاً به محیط تولید نزدیک است. ما کار گسترده‌ای انجام داده‌ایم تا مطمئن شویم همه چیز در زمان اجرای Node تا حد امکان به محیط تولید نزدیک است. با این حال، شبیه‌ساز، محیط تولید کامل کانتینر شده را تقلید نمی‌کند، بنابراین در حالی که کد تابع شما به صورت واقع‌بینانه اجرا می‌شود، سایر جنبه‌های محیط شما (یعنی فایل‌های محلی، رفتار پس از خرابی توابع و غیره) متفاوت خواهد بود.

مدیریت دسترسی ابری (IAM)

مجموعه شبیه‌ساز Firebase تلاشی برای تکرار یا رعایت هیچ رفتار مرتبط با IAM برای اجرا نمی‌کند. شبیه‌سازها به قوانین امنیتی Firebase ارائه شده پایبند هستند، اما در موقعیت‌هایی که معمولاً از IAM استفاده می‌شود، به عنوان مثال برای تنظیم توابع ابری که حساب سرویس و در نتیجه مجوزها را فراخوانی می‌کنند، شبیه‌ساز قابل تنظیم نیست و از حساب کاربری سراسری موجود در دستگاه توسعه‌دهنده شما استفاده می‌کند، مشابه اجرای مستقیم یک اسکریپت محلی.

محدودیت‌های حافظه و پردازنده

این شبیه‌ساز محدودیت‌های حافظه یا پردازنده را برای توابع شما اعمال نمی‌کند. با این حال، از طریق آرگومان زمان اجرای timeoutSeconds از توابع با زمان‌بندی مشخص پشتیبانی می‌کند.

توجه داشته باشید که زمان اجرای توابع ممکن است با زمان اجرای آنها در محیط عملیاتی (محیط تولید) متفاوت باشد، زمانی که توابع در شبیه‌ساز اجرا می‌شوند. توصیه می‌کنیم پس از طراحی و آزمایش توابع با شبیه‌ساز، آزمایش‌های محدودی را در محیط عملیاتی اجرا کنید تا زمان اجرا را تأیید کنید.

برنامه‌ریزی برای تفاوت‌ها در محیط‌های محلی و تولیدی

از آنجایی که شبیه‌ساز روی دستگاه محلی شما اجرا می‌شود، برای برنامه‌ها و برنامه‌های داخلی و ابزارهای کاربردی به محیط محلی شما بستگی دارد.

توجه داشته باشید که محیط محلی شما برای توسعه Cloud Functions ممکن است با محیط تولید گوگل متفاوت باشد:

  • برنامه‌هایی که به صورت محلی برای شبیه‌سازی محیط تولید نصب می‌کنید (مثلاً ImageMagick از این آموزش ) ممکن است از نظر رفتار با محیط تولید متفاوت باشند، به خصوص اگر به نسخه‌های متفاوتی نیاز دارید یا در یک محیط غیر لینوکسی توسعه می‌دهید. در نظر داشته باشید که نسخه باینری برنامه‌ی از دست رفته را در کنار استقرار تابع خود مستقر کنید.

  • به طور مشابه، ابزارهای داخلی (مثلاً دستورات پوسته مانند ls ، mkdir ) ممکن است با نسخه‌های موجود در محیط عملیاتی متفاوت باشند، به خصوص اگر در یک محیط غیر لینوکسی (مثلاً macOS) در حال توسعه هستید. می‌توانید این مشکل را با استفاده از جایگزین‌های Node-only برای دستورات بومی یا با ساخت فایل‌های باینری لینوکس برای همراه شدن با استقرار خود، برطرف کنید.

تلاش مجدد

شبیه‌ساز توابع ابری از امتحان مجدد توابع در صورت شکست پشتیبانی نمی‌کند.

بعدش چی؟