ضبط البيئة


ستحتاج غالبًا إلى تهيئة إضافية للدوال الخاصة بك، مثل مفاتيح واجهة برمجة التطبيقات التابعة لجهة خارجية أو الإعدادات القابلة للضبط حزمة تطوير البرامج (SDK) "Firebase" للعروض الترويجية "Cloud Functions" تهيئة بيئة مدمجة لتسهيل تخزين واسترداد ونوع البيانات لمشروعك.

يمكنك الاختيار من بين هذه الخيارات:

  • الإعداد باستخدام مَعلمة (يُنصح به في معظم السيناريوهات). يقدّم ذلك إعدادًا لبيئة بأنواع محدّدة باستخدام مَعلمات يتم التحقّق منها في وقت النشر، ما يؤدي بدوره إلى تجنُّب الأخطاء وتبسيط عملية تصحيح الأخطاء.
  • ضبط متغيّرات البيئة استنادًا إلى الملفات: باستخدام هذا النهج، يمكنك يدويًا إنشاء ملف dotenv لتحميله والمتغيرات البيئية.

في معظم حالات الاستخدام، يُنصَح بإعداد مَعلمات. يتيح هذا النهج توفّر قيم الإعدادات في وقت التشغيل ووقت النشر، ويؤدي إلى حظر النشر ما لم تكن جميع المَعلمات تحتوي على قيمة صالحة. وعلى العكس من ذلك، لا تتوفر التهيئة باستخدام متغيرات البيئة عند النشر الوقت.

الإعدادات باستخدام مَعلمة

يوفر Cloud Functions for Firebase واجهة لتحديد الإعدادات البيانات بشكل صريح داخل قاعدة التعليمات البرمجية. قيمة هذه المعاملات هي تكون متاحة أثناء نشر الدالة وعند إعداد النشر ووقت التشغيل والخيارات وأثناء التنفيذ. يعني ذلك أنّ واجهة سطر الأوامر ستحظر النشر ما لم تكن جميع المَعلمات ذات قيمة صالحة.

Node.js

const { onRequest } = require('firebase-functions/v2/https');
const { defineInt, defineString } = require('firebase-functions/params');

// Define some parameters
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
const welcomeMessage = defineString('WELCOME_MESSAGE');

// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
(req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

Python

from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")

# To use configured parameters inside the config for a function, provide them
# directly. To use them at runtime, call .value() on them.
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')

عند نشر دالة باستخدام متغيرات تهيئة المعلمة، يحاول واجهة سطر الأوامر في Firebase أولاً تحميل قيمه من ملفات .env المحلية. إذا غير موجودة في هذين الملفين ولم يتم ضبط default، سيطلب سطر الأوامر القيم أثناء النشر، ثم حفظ القيم تلقائيًا في ملف .env باسم .env.<project_ID> في دليل functions/:

$ firebase deploy
i  functions: preparing codebase default for deployment
? Enter a string value for ENVIRONMENT: prod
i  functions: Writing new parameter values to disk: .env.projectId
…
$ firebase deploy
i  functions: Loaded environment variables from .env.projectId

بناءً على سير عمل التطوير، قد يكون من المفيد إضافة ملف .env.<project_ID> الذي تم إنشاؤه إلى عنصر التحكّم في الإصدار.

استخدام مَعلمات في نطاق عمومي

أثناء النشر، يتم تحميل رمز الدوال وفحصه قبل المعاملات لها قيم فعلية. وهذا يعني أنّ جلب قيم المَعلمات أثناء النطاق العام يؤدي إلى تعذُّر النشر. بالنسبة إلى الحالات التي تريد فيها استخدام لإعداد قيمة عمومية، استخدم استدعاء الإعداد onInit() يتم تنفيذ ردّ الاتصال هذا قبل تنفيذ أيّ وظائف في مرحلة الإنتاج، ولكن لا يتمّ استدعاؤه أثناء وقت النشر، لذا فهو مكان آمن للوصول إلى قيمة المَعلمة.

Node.js

const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v2/core');

const apiKey = defineSecret('GOOGLE_API_KEY');

let genAI;
onInit(() => {
  genAI = new GoogleGenerativeAI(apiKey.value());
})

Python

from firebase_functions.core import init
from firebase_functions.params import StringParam, PROJECT_ID
import firebase_admin
import vertexai

location = StringParam("LOCATION")

x = "hello"

@init
def initialize():
  # Note: to write back to a global, you'll need to use the "global" keyword
  # to avoid creating a new local with the same name.
  global x
  x = "world"
  firebase_admin.initialize_app()
  vertexai.init(PROJECT_ID.value, location.value)

في حال استخدام معلمات من النوع Secret، فلاحظ أنها متاحة فقط في عملية الدوال التي ربطت السر. في حال ربط سرّ في بعض الدوال فقط، يمكنك التحقّق مما إذا كان secret.value() خطأ قبل استخدامه.

ضبط سلوك واجهة سطر الأوامر

يمكن ضبط المَعلمات باستخدام كائن Options يتحكّم في كيفية طلب CLI للقيم. يحدِّد المثال التالي خيارات للتحقّق من تنسيق رقم الهاتف، وتوفير خيار اختيار بسيط، و preenchimento خيار اختيار تلقائيًا من مشروع Firebase:

Node.js

const { defineString } = require('firebase-functions/params');

const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});

const onlyPhoneNumbers = defineString('PHONE_NUMBER', {
  input: {
    text: {
      validationRegex: /\d{3}-\d{3}-\d{4}/,
      validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"
    },
  },
});

const selectedOption = defineString('PARITY', {input: params.select(["odd", "even"])});

const memory = defineInt("MEMORY", {
  description: "How much memory do you need?",
  input: params.select({ "micro": 256, "chonky": 2048 }),
});

const extensions = defineList("EXTENSIONS", {
  description: "Which file types should be processed?",
  input: params.multiSelect(["jpg", "tiff", "png", "webp"]),
});

const storageBucket = defineString('BUCKET', {
  description: "This will automatically
populate the selector field with the deploying Cloud Projects
storage buckets",
  input: params.PICK_STORAGE_BUCKET,
});

Python

from firebase_functions.params import (
    StringParam,
    ListParam,
    TextInput,
    SelectInput,
    SelectOptions,
    ResourceInput,
    ResourceType,
)

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")

WELCOME_MESSAGE = StringParam(
    "WELCOME_MESSAGE",
    default="Hello World",
    description="The greeting that is returned to the caller of this function",
)

ONLY_PHONE_NUMBERS = StringParam(
    "PHONE_NUMBER",
    input=TextInput(
        validation_regex="\d{3}-\d{3}-\d{4}",
        validation_error_message="Please enter a phone number in the format XXX-YYY-XXX",
    ),
)

SELECT_OPTION = StringParam(
    "PARITY",
    input=SelectInput([SelectOptions(value="odd"), SelectOptions(value="even")]),
)

STORAGE_BUCKET = StringParam(
    "BUCKET",
    input=ResourceInput(type=ResourceType.STORAGE_BUCKET),
    description="This will automatically populate the selector field with the deploying Cloud Project's storage buckets",
)

أنواع المَعلمات

توفر التكوينات المعلمة كتابة قوية لقيم المعلمات، وتدعم أيضًا الأسرار من Cloud Secret Manager الأنواع المتوافقة هي:

  • سري
  • سلسلة
  • منطقي
  • العدد الصحيح
  • عائم
  • قائمة (Node.js)

تعابير المَعلمات وقيمها

يقيّم Firebase معلماتك في وقت النشر وأثناء الدالة. قيد التنفيذ. وبسبب هذه البيئتين المزدوجتين، يجب توخي الحذر الإضافي عندما ومقارنة قيم المعامل، وعند استخدامها لتحديد خيارات بيئة التشغيل الأخرى.

لتمرير معلمة إلى الدالة كخيار وقت تشغيل، عليك تمريرها مباشرةً:

Node.js

const { onRequest } = require('firebase-functions/v2/https');
const { defineInt } = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');

export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
  (req, res) => {
    //…

Python

from firebase_functions import https_fn
from firebase_functions.params import IntParam

MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")

@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    ...

بالإضافة إلى ذلك، إذا كنت بحاجة إلى المقارنة مع معلمة لمعرفة ما ينبغي اختياره، ينبغي استخدام مقارنات مضمنة بدلاً من التحقق من القيمة:

Node.js

const { onRequest } = require('firebase-functions/v2/https');
const environment = params.defineString(ENVIRONMENT, {default: 'dev'});

// use built-in comparators
const minInstancesConfig = environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = onRequest(
  { minInstances: minInstancesConfig },
  (req, res) => {
    //…

Python

from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam

ENVIRONMENT = StringParam("ENVIRONMENT", default="dev")
MIN_INSTANCES = ENVIRONMENT.equals("PRODUCTION").then(10, 0)

@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
    ...

يمكن أن تكون المعلّمات وتعبيرات المعلَمات التي لا يتم استخدامها إلا في وقت التشغيل يتم الوصول إليها باستخدام دالة value:

Node.js

const { onRequest } = require('firebase-functions/v2/https');
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE');

// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = onRequest(
(req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

Python

from firebase_functions import https_fn
from firebase_functions.params import StringParam

WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")

@https_fn.on_request()
def hello_world(req):
    return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')

المعلمات المضمنة

توفِّر حزمة تطوير برامج Cloud Functions ثلاث معلَمات محدّدة مسبقًا، وهي متاحة من الحزمة الفرعية firebase-functions/params:

Node.js

  • projectID: مشروع Cloud الذي يتم فيه تشغيل الدالة
  • databaseURL — عنوان URL لمثيل قاعدة البيانات في الوقت الفعلي المرتبط مع الدالة (إذا كانت مفعّلة في مشروع Firebase).
  • storageBucket: حزمة Cloud Storage المرتبطة بالدالة (إذا كانت مفعّلة في مشروع Firebase)

Python

  • PROJECT_ID: مشروع Cloud الذي يتم تشغيل الدالة فيه
  • DATABASE_URL — عنوان URL لمثيل قاعدة البيانات في الوقت الفعلي المرتبط مع الدالة (إذا كانت مفعّلة في مشروع Firebase).
  • STORAGE_BUCKET — حزمة Cloud Storage المرتبطة بالدالة (في حال تفعيله في مشروع Firebase).

هذه الدالة مثل السلسلة التي يحددها المستخدم بكل الجوانب، باستثناء أنه، نظرًا لأن قيمها معروفة دائمًا واجهة سطر الأوامر في Firebase، فلن يُطلب منك أبدًا كتابة قيمها عند النشر تم حفظ الملف في .env ملف.

المَعلمات السرية

تمثّل المَعلمات من النوع Secret، التي يتم تحديدها باستخدام defineSecret()، مَعلمات سلاسل تحتوي على قيمة مخزّنة في Cloud Secret Manager. بدلاً من والتحقق من ملف .env محلي وكتابة قيمة جديدة في الملف إذا المفقودة، تتحقق المعلمات السرية من وجودها في Cloud Secret Manager بشكل تفاعلي للحصول على قيمة سر جديد أثناء النشر.

ويجب ربط المعاملات السرية المحددة بهذه الطريقة بالدوال الفردية التي يمكنهم الوصول إليها:

Node.js

const { onRequest } = require('firebase-functions/v2/https');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');

export const postToDiscord = onRequest(
  { secrets: [discordApiKey] },
  (req, res) => {
  const apiKey = discordApiKey.value();
    //…

Python

from firebase_functions import https_fn
from firebase_functions.params import SecretParam

DISCORD_API_KEY = SecretParam('DISCORD_API_KEY')

@https_fn.on_request(secrets=[DISCORD_API_KEY])
def post_to_discord(req):
    api_key = DISCORD_API_KEY.value

ولأنّ قيم الأسرار تكون مخفية إلى حين تنفيذ الدالة، لا يمكنك استخدامها أثناء ضبط الدالة.

متغيرات البيئة

يتوافق Cloud Functions for Firebase مع dotenv نسق ملف لتحميل متغيرات البيئة المحددة في ملف .env على ملف وقت تشغيل التطبيق. وبمجرد نشر المتغيرات، يمكن قراءة متغيرات البيئة من خلال process.env (في مشاريع مستندة إلى Node.js) أو os.environ (بوصة المشروعات القائمة على بايثون).

لضبط بيئتك بهذه الطريقة، يمكنك إنشاء ملف .env في مشروعك، وإضافة المتغيرات المطلوبة ونشرها:

  1. أنشِئ ملف .env في دليل functions/:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. افتح ملف .env لتعديله وأضِف المفاتيح المطلوبة. على سبيل المثال:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. تفعيل الدوال والتأكّد من تحميل متغيّرات البيئة:

    firebase deploy --only functions
    # ...
    # i functions: Loaded environment variables from .env.
    # ...
    

بعد نشر متغيرات البيئة المخصصة، يمكن لرمز الدالة الوصول إليها:

Node.js

// Responds with "Hello Earth and Humans"
exports.hello = onRequest((request, response) => {
  response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});

Python

import os

@https_fn.on_request()
def hello(req):
    return https_fn.Response(
        f"Hello {os.environ.get('PLANET')} and {os.environ.get('AUDIENCE')}"
    )

نشر مجموعات متعددة من متغيرات البيئة

إذا كنت بحاجة إلى مجموعة بديلة من متغيّرات البيئة لمنصة Firebase (مثل التقسيم مقابل الإنتاج)، وإنشاء ملف .env.<project or alias> وكتابة المتغيرات البيئية الخاصة بالمشروع هناك. متغيرات البيئة من .env وملفات .env الخاصة بالمشروع (إن وجدت) في جميع الدوال المنشورة.

على سبيل المثال، يمكن أن يتضمن المشروع هذه الملفات الثلاثة التي تحتوي على قيم مختلفة للتطوير والإنتاج:

.env .env.dev .env.prod
PLANET=الأرض

الجمهور=البشر

الجمهور=فريق مطوّري البرامج AUDIENCE=Prod Humans

وبالنظر إلى القيم الموجودة في هذه الملفات المنفصلة، فإن مجموعة متغيرات البيئة ستختلف الوظائف الخاصة بك تبعًا لمشروعك المستهدف:

$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Dev Humans

$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Prod Humans

متغيّرات البيئة المحجوزة

بعض مفاتيح متغيّرات البيئة محجوزة للاستخدام الداخلي. لا تستخدم أيًا من المفاتيح التالية في ملفات .env:

  • جميع المفاتيح التي تبدأ بـ X_GOOGLE_
  • تبدأ جميع المفاتيح بـ EXT_
  • تبدأ كل المفاتيح بـ FIREBASE_
  • أي مفتاح من القائمة التالية:
  • CLOUD_RUNTIME_CONFIG
  • ENTRY_POINT
  • مشروع_Google Cloud Platform
  • مشروع GCLOUD
  • مشروع GOOGLE_CLOUD
  • FUNCTION_TRIGGER_TYPE
  • الدالة FUNCTION_NAME
  • FUNCTION_MEMORY_MB
  • الدالة FUNCTION_🔐_SEC
  • الدالة FUNCTION_IDENTITY
  • FUNCTION_ AR
  • الدالة FUNCTION_TARGET
  • الوظيفة_SIGNATURE_TYPE
  • خدمة K_SERVICE
  • المراجعة_K
  • المنفذ
  • الإعداد كيه

تخزين معلومات الإعداد الحساسة والوصول إليها

يمكن استخدام متغيرات البيئة المخزَّنة في ملفات .env للدالة. التكوين، ولكن لا ينبغي لك اعتبارها طريقة آمنة لتخزين معلومات مثل بيانات اعتماد قاعدة البيانات أو مفاتيح واجهة برمجة التطبيقات. يعد ذلك خاصةً مهم إذا تحققت من ملفات .env في عنصر تحكم المصدر.

لمساعدتك على تخزين معلومات الإعداد الحساسة، Cloud Functions for Firebase يتكامل مع Google Cloud Secret Manager وتخزن هذه الخدمة المشفرة قيم التهيئة بأمان، بينما مع الاستمرار في السماح بالوصول بسهولة من الدوال عند الحاجة.

إنشاء مفتاح سرّي واستخدامه

لإنشاء واجهة برمجة تطبيقات سرّية، استخدِم واجهة سطر الأوامر Firebase.

لإنشاء مفتاح سرّي واستخدامه:

  1. من جذر دليل المشروع المحلي، شغِّل الأمر التالي:

    firebase functions:secrets:set SECRET_NAME

  2. يُرجى إدخال قيمة في حقل "SECRET_NAME".

    يعرض واجهة سطر الأوامر رسالة نجاح ويحذّرك من ضرورة نشر دوال. لكي يتم تطبيق التغيير.

  3. قبل النشر، تأكد من أن رمز الدوال يسمح للدالة بالوصول إلى السر باستخدام المعلمة runWith:

    Node.js

    const { onRequest } = require('firebase-functions/v2/https');
    
    exports.processPayment = onRequest(
      { secrets: ["SECRET_NAME"] },
      (req, res) => {
        const myBillingService = initializeBillingService(
          // reference the secret value
          process.env.SECRET_NAME
        );
        // Process the payment
      }
    );

    Python

    import os
    from firebase_functions import https_fn
    
    @https_fn.on_request(secrets=["SECRET_NAME"])
    def process_payment(req):
        myBillingService = initialize_billing(key=os.environ.get('SECRET_NAME'))
        # Process the payment
        ...
    
  4. نشر Cloud Functions:

    firebase deploy --only functions

    ستتمكن الآن من الوصول إليه مثل أي متغير بيئي آخر. وعلى العكس، إذا كانت دالة أخرى لا تحدد السر في يحاول runWith الوصول إلى المفتاح السرّي، وسيتلقّى قيمة غير محدَّدة:

    Node.js

    exports.anotherEndpoint = onRequest((request, response) => {
      response.send(`The secret API key is ${process.env.SECRET_NAME}`);
      // responds with "The secret API key is undefined" because the `runWith` parameter is missing
    });
    

    Python

    @https_fn.on_request()
    def another_endpoint(req):
        return https_fn.Response(f"The secret API key is {os.environ.get("SECRET_NAME")}")
        # Responds with "The secret API key is None" because the `secrets` parameter is missing.
    

بمجرد نشر الدالة، ستتمكن من الوصول إلى القيمة السرية. فقط الدوال التي تتضمن على وجه التحديد سرًا في المعلمة runWith الخاصة بها حق الوصول إلى هذا السر كمتغير بيئي. يساعدك ذلك في التأكّد من أنّ قيم الأسرار لا تتوفّر إلا عند الحاجة إليها، ما يقلل من خطر تسرُّب سرّ عن طريق الخطأ.

إدارة الأسرار

يمكنك استخدام واجهة سطر الأوامر Firebase لإدارة المفاتيح السرّية. أثناء إدارة الأسرار بهذه الطريقة، فبعض تغييرات واجهة سطر الأوامر تتطلب منك تعديلها و/أو إعادة نشرها الدوال المرتبطة بها. وعلى وجه التحديد:

  • عندما تحدد قيمة جديدة لأحد المفاتيح، يجب إعادة نشر جميع الدوال التي تشير السر للحصول على أحدث قيمة.
  • إذا حذفت سرًا، تأكد من عدم وجود أي من الدوال المنشورة يشير إلى هذا السر. ستتعطّل الدوال التي تستخدِم قيمة سرية تم حذفها بدون إشعار.

في ما يلي ملخّص لأوامر واجهة سطر الأوامر Firebase للإدارة السرية:

# Change the value of an existing secret
firebase functions:secrets:set SECRET_NAME

# View the value of a secret
functions:secrets:access SECRET_NAME

# Destroy a secret
functions:secrets:destroy SECRET_NAME

# View all secret versions and their state
functions:secrets:get SECRET_NAME

# Automatically clean up all secrets that aren't referenced by any of your functions
functions:secrets:prune

بالنسبة إلى الأمرَين access وdestroy، يمكنك تقديم الإصدار الاختياري. لإدارة إصدار معين. على سبيل المثال:

functions:secrets:access SECRET_NAME[@VERSION]

لمزيد من المعلومات حول هذه العمليات، أدخِل -h مع الأمر إلى عرض مساعدة واجهة سطر الأوامر.

كيفية فوترة الأسرار

يسمح Secret Manager بـ 6 مفاتيح سرّية نشطة إصدارات بدون أي تكلفة. وهذا يعني أنّه يمكنك الحصول على 6 أسرار شهريًا في مشروع Firebase بدون أي تكلفة.

يحاول واجهة سطر الأوامر Firebase تلقائيًا إزالة المفتاح السرّي غير المستخدَم تلقائيًا الإصدارات متى كان ذلك مناسبًا، مثل نشر الدوال مع إصدار جديد السر. يمكنك أيضًا تنظيف الأسرار غير المستخدَمة بشكل نشط باستخدام functions:secrets:destroy وfunctions:secrets:prune.

يسمح Secret Manager بـ 10,000 عملية وصول شهرية لم يتم إرسال فواتير بها على سرّي. تقرأ مثيلات الدوال المفاتيح السرّية المحدّدة في runWith فقط. في كل مرة تعمل فيها على البارد. إذا كان لديك الكثير من مثيلات الدوال قراءة الكثير من الأسرار، فقد يتجاوز مشروعك هذا الحد، وعندها سيتم تحصيل 0.03 دولار منك مقابل كل 10000 عملية وصول.

لمزيد من المعلومات، يُرجى مراجعة أسعار Secret Manager:

إتاحة المحاكي

تم تصميم إعداد البيئة باستخدام dotenv للتفاعل مع محاكي Cloud Functions محلي.

عند استخدام محاكي Cloud Functions محلي، يمكنك إلغاء البيئة. المختلفة لمشروعك من خلال إعداد ملف .env.local. محتويات تكون الأولوية .env.local على .env وملف .env الخاص بالمشروع.

على سبيل المثال، يمكن أن يتضمن المشروع هذه الملفات الثلاثة التي تحتوي على قيم مختلفة للتطوير والاختبار المحلي:

.env .env.dev .env.local
PLANET=الأرض

الجمهور=البشر

الجمهور=فريق مطوّري البرامج الجمهور=أشخاص محليون

عند بدء تشغيل المحاكي في السياق المحلي، فإنه يحمّل البيئة المتغيرات كما هو موضح:

  $ 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. هذا يجعل من اختبار الدوال محليًا، خاصةً إذا لم يكن لديك وصول إلى القيمة السرية.

نقل البيانات من إعدادات البيئة

إذا كنت تستخدم إعدادات البيئة من خلال functions.config، عليك يمكنه ترحيل تهيئةك الحالية كمتغيرات للبيئة (في dotenv). يوفّر واجهة سطر الأوامر Firebase أمر تصدير يُخرج الإعدادات. لكل اسم مستعار أو مشروع مدرج في ملف .firebaserc في الدليل (في المثال أدناه، local وdev وprod) كملفات .env.

لنقل البيانات، يمكنك تصدير عمليات ضبط البيئة الحالية باستخدام الأمر firebase functions:config:export:

firebase functions:config:export
i  Importing configs from projects: [project-0, project-1]
⚠  The following configs keys could not be exported as environment variables:

⚠  project-0 (dev):
    1foo.a => 1FOO\_A (Key 1FOO\_A must start with an uppercase ASCII letter or underscore, and then consist of uppercase ASCII letters, digits, and underscores.)

Enter a PREFIX to rename invalid environment variable keys: CONFIG\_
✔  Wrote functions/.env.prod
✔  Wrote functions/.env.dev
✔  Wrote functions/.env.local
✔  Wrote functions/.env

يُرجى العِلم أنّه في بعض الحالات، سيُطلب منك إدخال بادئة لإعادة تسمية مفاتيح متغيّرات البيئة المُصدَّرة. وذلك لأنه لا يمكن لبعض التهيئات يتم تحويلها تلقائيًا؛ نظرًا لأنها قد تكون غير صالحة أو قد تكون مفتاح متغير البيئة المحجوزة.

ننصحك بمراجعة محتويات ملفات .env التي تم إنشاؤها بعناية قبل نشر وظائفك أو التحقّق من ملفات .env في أداة التحكّم في المصدر. في حال حذف أي قيم حسّاسة ويجب عدم تسريبها، يُرجى إزالتها من ".env". من الملفات وتخزينها بأمان في Secret Manager بدلاً من ذلك.

ستحتاج أيضًا إلى تعديل رمز الدوالّ. أي دوال تستخدم سيكون على "functions.config" الآن استخدام process.env بدلاً من ذلك، كما هو موضّح في متغيّرات البيئة: