إعداد بيئتك


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

يمكنك الاختيار بين ثلاثة خيارات:

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

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

التكوين المعلمة

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

لتحديد المعلمات في التعليمات البرمجية الخاصة بك، اتبع هذا النموذج:

const functions = require('firebase-functions');
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 = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

عند نشر وظيفة بمتغيرات تكوين ذات معلمات، تحاول واجهة سطر أوامر Firebase أولاً تحميل قيمها من ملفات .env المحلية. إذا لم تكن موجودة في تلك الملفات ولم يتم تعيين أي default ، فستطالب واجهة سطر الأوامر (CLI) بالقيم أثناء النشر، ثم تحفظ قيمها تلقائيًا في ملف .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> الذي تم إنشاؤه إلى التحكم في الإصدار.

تكوين سلوك CLI

يمكن تكوين المعلمات باستخدام كائن Options الذي يتحكم في كيفية مطالبة واجهة سطر الأوامر (CLI) بالقيم. يعين المثال التالي خيارات للتحقق من صحة تنسيق رقم الهاتف، ولتوفير خيار تحديد بسيط، ولملء خيار التحديد تلقائيًا من مشروع Firebase:

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: {select: {options:
[{value: "odd"}, {value: "even"}]}}})

const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets"})

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

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

  • سر
  • خيط
  • منطقية
  • عدد صحيح
  • يطفو

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

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

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

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

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

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

const functions = require('firebase-functions');
const { defineBool } = require('firebase-functions/params');
const environment = params.defineString(‘ENVIRONMENT’, {default: ‘dev’});

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

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

const functions = require('firebase-functions');
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 = functions.https.onRequest(
 (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

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

تقدم Cloud Functions SDK ثلاثة معلمات محددة مسبقًا، متاحة من الحزمة الفرعية firebase-functions/params :

  • projectID - المشروع السحابي الذي تعمل فيه الوظيفة.
  • databaseURL - عنوان URL لمثيل قاعدة بيانات Realtime المرتبط بالوظيفة (إذا تم تمكينه في مشروع Firebase).
  • storageBucket - مجموعة التخزين السحابي المرتبطة بالوظيفة (إذا تم تمكينها في مشروع Firebase).

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

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

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

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

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

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

نظرًا لأن قيم الأسرار تكون مخفية حتى تنفيذ الوظيفة، فلا يمكنك استخدامها أثناء تكوين وظيفتك.

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

تدعم Cloud Functions for Firebase تنسيق ملف dotenv لتحميل متغيرات البيئة المحددة في ملف .env في وقت تشغيل التطبيق الخاص بك. بمجرد النشر، يمكن قراءة متغيرات البيئة عبر واجهة process.env .

لتكوين بيئتك بهذه الطريقة، قم بإنشاء ملف .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.
    # ...
    

بمجرد نشر متغيرات البيئة المخصصة الخاصة بك، يمكن لرمز وظيفتك الوصول إليها باستخدام بناء جملة process.env :

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

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

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

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

.env .env.dev .env.prod
الكوكب=الأرض

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

الجمهور = البشر المطورون الجمهور = همز البشر

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

$ 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
  • نقطة الدخول
  • GCP_PROJECT
  • GCLOUD_PROJECT
  • GOOGLE_CLOUD_PROJECT
  • FUNCTION_TRIGGER_TYPE
  • اسم وظيفة
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • خدمة K_SERVICE
  • K_REVISION
  • ميناء
  • K_CONFIGURATION

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

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

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

إنشاء واستخدام سر

لإنشاء سر، استخدم Firebase CLI.

لإنشاء سر واستخدامه:

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

    firebase functions:secrets:set SECRET_NAME

  2. أدخل قيمة لـ SECRET_NAME .

    تردد واجهة سطر الأوامر (CLI) رسالة نجاح وتحذر من أنه يجب عليك نشر الوظائف حتى يسري التغيير.

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

    exports.processPayment = functions
      // Make the secret available to this function
      .runWith({ secrets: ["SECRET_NAME"] })
      .onCall((data, context) => {
        const myBillingService = initializeBillingService(
          // reference the secret value
          process.env.SECRET_NAME
        );
        // Process the payment
      });
  4. نشر الوظائف السحابية:

    firebase deploy --only functions

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

  exports.anotherEndpoint = functions.https.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
  });

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

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

استخدم Firebase CLI لإدارة أسرارك. أثناء إدارة الأسرار بهذه الطريقة، ضع في اعتبارك أن بعض تغييرات واجهة سطر الأوامر (CLI) تتطلب منك تعديل و/أو إعادة نشر الوظائف المرتبطة. خاصة:

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

فيما يلي ملخص لأوامر Firebase CLI للإدارة السرية:

# 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 باستخدام الأمر لعرض مساعدة CLI.

كيف يتم إصدار فاتورة الأسرار

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

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

يسمح Secret Manager بإجراء 10000 عملية وصول شهرية غير مفوترة على سر. تقرأ مثيلات الوظائف فقط الأسرار المحددة في معلمة runWith الخاصة بها في كل مرة تبدأ فيها التشغيل البارد. إذا كان لديك الكثير من مثيلات الوظائف التي تقرأ الكثير من الأسرار، فقد يتجاوز مشروعك هذا البدل، وعند هذه النقطة سيتم محاسبتك بمبلغ 0.03 USD لكل 10000 عملية وصول.

لمزيد من المعلومات، راجع تسعير المدير السري .

دعم المحاكي

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

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

الهجرة من تكوين البيئة

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

تكوين البيئة

قبل إصدار دعم متغير البيئة في firebase-functions v3.18.0 ، كان استخدام functions.config() هو الأسلوب الموصى به لتكوين البيئة. لا يزال هذا الأسلوب مدعومًا، ولكننا نوصي جميع المشاريع الجديدة باستخدام متغيرات البيئة بدلاً من ذلك، لأنها أسهل في الاستخدام وتحسن إمكانية نقل التعليمات البرمجية الخاصة بك.

قم بتعيين تكوين البيئة باستخدام CLI

لتخزين بيانات البيئة، يمكنك استخدام الأمر firebase functions:config:set في واجهة سطر أوامر Firebase . يمكن تخصيص مساحة الاسم لكل مفتاح باستخدام النقاط لتجميع التكوينات ذات الصلة معًا. ضع في اعتبارك أنه يتم قبول الأحرف الصغيرة فقط في المفاتيح ؛ غير مسموح بالأحرف الكبيرة.

على سبيل المثال، لتخزين معرف العميل ومفتاح واجهة برمجة التطبيقات لـ "بعض الخدمات"، يمكنك تشغيل:

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

استرداد تكوين البيئة الحالية

لفحص ما تم تخزينه حاليًا في تكوين البيئة لمشروعك، يمكنك استخدام firebase functions:config:get . سيتم إخراج JSON بشيء من هذا القبيل:

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

تعتمد هذه الوظيفة على Google Cloud Runtime Configuration API .

استخدم functions.config للوصول إلى تكوين البيئة في إحدى الوظائف

يتم توفير بعض التكوينات تلقائيًا ضمن مساحة اسم firebase المحجوزة. يتم توفير تكوين البيئة داخل وظيفة التشغيل الخاصة بك عبر functions.config() . لاستخدام التكوين أعلاه، قد يبدو الرمز الخاص بك كما يلي:

const functions = require('firebase-functions');
const request = require('request-promise');

exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
  let email = event.data.child('email').val();

  return request({
    url: 'https://someservice.com/api/some/call',
    headers: {
      'X-Client-ID': functions.config().someservice.id,
      'Authorization': `Bearer ${functions.config().someservice.key}`
    },
    body: {email: email}
  });
});

استخدم تكوين البيئة لتهيئة الوحدة النمطية

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

على سبيل المثال، لاستخدام وحدة Slack Node SDK ، يمكنك كتابة ما يلي:

const functions = require('firebase-functions');
const IncomingWebhook = require('@slack/client').IncomingWebhook;
const webhook = new IncomingWebhook(functions.config().slack.url);

قبل النشر، قم بتعيين متغير تكوين بيئة slack.url :

firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX

أوامر البيئة الإضافية

  • firebase functions:config:unset key1 key2 يزيل المفاتيح المحددة من التكوين
  • firebase functions:config:clone --from <fromProject> تستنسخ بيئة مشروع آخر في المشروع النشط حاليًا.

متغيرات البيئة التي يتم ملؤها تلقائيًا

توجد متغيرات بيئة يتم ملؤها تلقائيًا في وقت تشغيل الوظائف وفي الوظائف التي تمت محاكاتها محليًا. يتضمن ذلك تلك التي يتم ملؤها بواسطة Google Cloud ، بالإضافة إلى متغير البيئة الخاص بـ Firebase:

process.env.FIREBASE_CONFIG : يوفر معلومات تكوين مشروع Firebase التالية:

{
  databaseURL: 'https://databaseName.firebaseio.com',
  storageBucket: 'projectId.appspot.com',
  projectId: 'projectId'
}

يتم تطبيق هذا التكوين تلقائيًا عند تهيئة Firebase Admin SDK بدون أي وسائط. إذا كنت تكتب وظائف في JavaScript، قم بالتهيئة على النحو التالي:

const admin = require('firebase-admin');
admin.initializeApp();

إذا كنت تكتب وظائف في TypeScript، فقم بالتهيئة على النحو التالي:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import 'firebase-functions';
admin.initializeApp();

إذا كنت بحاجة إلى تهيئة Admin SDK بتكوين المشروع الافتراضي باستخدام بيانات اعتماد حساب الخدمة، فيمكنك تحميل بيانات الاعتماد من ملف وإضافتها إلى FIREBASE_CONFIG مثل هذا:

serviceAccount = require('./serviceAccount.json');

const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);