एक से ज़्यादा फ़ंक्शन व्यवस्थित करें


जैसे-जैसे Cloud Functions को अपने प्रोजेक्ट में इंटिग्रेट किया जाता है, आपका कोड इनमें कई इंडिपेंडेंट फ़ंक्शन होते हैं. ऐसा हो सकता है कि आपके पास कई फ़ंक्शन हों एक ही फ़ाइल में उचित रूप से फ़िट हो सके, या अलग-अलग टीमें अलग-अलग ग्रुप डिप्लॉय कर सकती हैं जिससे किसी टीम के ओवरराइट होने या गलती से मिट जाने का जोखिम रहता है किसी अन्य टीम के फ़ंक्शन पर नज़र रख रहे हैं. Cloud Functions, आपकी साइट को व्यवस्थित करने के आपके फ़ंक्शन पर नेविगेट करना और उन्हें मैनेज करना आसान बनाने के लिए कोड.

कोड बेस में फ़ंक्शन व्यवस्थित करना

फ़ंक्शन कॉन्फ़िगरेशन ऑब्जेक्ट की codebase प्रॉपर्टी का इस्तेमाल, इसमें किया जा सकता है एक से ज़्यादा में फ़ंक्शन के बड़े कलेक्शन को मैनेज करने के लिए firebase.json एक ही रिपॉज़िटरी मोनो रिपॉज़िटरी के सेटअप में, रिपॉज़िटरी या सब-पैकेज:

# firebase.json
"functions": {
  "codebase": "my-codebase"
  # NOTE: Codebase must be less than 63 characters and can contain only
  # lowercase letters, numeric characters, underscores, and dashes.
}

codebase प्रॉपर्टी, Firebase सीएलआई v10.7.1 और इसके बाद के वर्शन में काम करती है.

डेटा स्टोर करने की एक से ज़्यादा जगहों को मैनेज करना

codebase प्रॉपर्टी की मदद से, कई प्रॉपर्टी को आसानी से मैनेज किया जा सकता है डेटा स्टोर करने की जगहें. चलिए, एक ऐसे मामले के बारे में बात करते हैं जहां आपके पास डेटा स्टोर करने की दो अलग-अलग जगहें हैं जो एक ही Firebase प्रोजेक्ट में फ़ंक्शन डिप्लॉय करते हैं:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

कोड बेस एनोटेशन के बिना, Firebase सीएलआई ने आपको डिप्लॉयमेंट के समय, अन्य डेटा स्टोर करने की जगह में तय किए गए फ़ंक्शन मिटाएं:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
  functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
        fn1FromRepoB
        fn2FromRepoB
        ...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

इसमें यूनीक कोड बेस एनोटेशन जोड़कर, इस समस्या से बचा जा सकता है हर प्रोजेक्ट रिपॉज़िटरी में firebase.json का कॉन्फ़िगरेशन सेक्शन:

# repoA/firebase.json
"functions": {
  "codebase": "repo-a"
}

# repoB/firebase.json
"functions": {
  "codebase": "repo-b"
}

कोड बेस के बारे में जानकारी देने के साथ, Firebase सीएलआई आपको मिटाने का अनुरोध नहीं करता ऐसे फ़ंक्शन जिन्हें आपके मौजूदा डेटा स्टोर करने की जगह के बाहर परिभाषित किया गया है:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
  functions: functions folder uploaded successfully
#  Gleefully ignores functions from repoB
i  functions: creating Node.js 16 function fnFromRepoA (us-central1)...
  Deploy Complete!

एक से ज़्यादा सोर्स पैकेज मैनेज करना (मोनो रिपॉज़िटरी)

codebase प्रॉपर्टी की मदद से, एक से ज़्यादा सोर्स को आसानी से मैनेज किया जा सकता है एक रिपॉज़िटरी (डेटा स्टोर करने की जगह) में मौजूद पैकेज को इकट्ठा करता है. चलिए, एक ऐसे मामले के बारे में जानते हैं जिसमें आपके पास Firebase है कई सब-पैकेज में फैली हुई फ़ंक्शन परिभाषाओं वाली प्रोजेक्ट डायरेक्ट्री:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

यह सेटअप इन उदाहरणों के लिए सही है:

  • आपके पास मोनो रिपॉज़िटरी सेटअप है. साथ ही, अलग-अलग टीमें अलग-अलग फ़ंक्शन को अलग-अलग पैकेज में मैनेज करती हैं.
  • आपके पास एक ऐसा फ़ंक्शन है जिसमें बहुत ज़्यादा बाहरी डिपेंडेंसी और लंबे समय तक चलने वाला इनिशलाइज़ेशन है. साथ ही, आपको इस फ़ंक्शन को इंतज़ार के समय को ध्यान में रखकर बनाए गए अन्य फ़ंक्शन से अलग करना है.

इस तरह के मॉनरेपो सेटअप के साथ काम करने के लिए, एक से ज़्यादा फ़ंक्शन कॉन्फ़िगरेशन तय करें firebase.json में:

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

इस कॉन्फ़िगरेशन के साथ, Firebase सीएलआई सभी पैकेज से फ़ंक्शन डिप्लॉय करता है का इस्तेमाल करने के लिए कहें:

$ firebase deploy --only functions
i  deploying functions
i  functions: preparing codebase team-a for deployment
i  functions: preparing codebase team-b for deployment
i  functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i  functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...

आपके पास एक खास कोड बेस को डिप्लॉय करने का विकल्प भी है:

$ firebase deploy --only functions:team-b
i  deploying functions
i  functions: preparing codebase team-b for deployment
i  functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...

कई फ़ाइलों में फ़ंक्शन लिखें

Cloud Functions के साथ शुरू करते समय, हो सकता है कि आप अपने शुरुआती कुछ लक्ष्य रखें एक फ़ाइल में फ़ंक्शन:

index.js

const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

Main.py

from firebase_functions import https_fn

@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello bar!")

हालांकि, कुछ फ़ंक्शन से इसे मैनेज करना मुश्किल हो सकता है. इसके बजाय, आप हर फ़ंक्शन के लिए आपके सभी लॉजिक को उसकी फ़ाइल में रख सकता है और सोर्स फ़ाइल को एक्सपोर्ट की सूची के तौर पर चुनें:

Node.js

foo.js

const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js

const functions = require('firebase-functions/v1');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.js

const foo = require('./foo');
const bar = require('./bar');
exports.foo = foo.foo;
exports.bar = bar.bar;

Python

foo.py

from firebase_functions import https_fn

@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

bar.py

from firebase_functions import https_fn

@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello foo!")

main.py

from fn_impl.foo import *
from fn_impl.bar import *

यह सेटअप इस तरह की प्रोजेक्ट डायरेक्ट्री का स्ट्रक्चर मान लेता है:

my-project
├── firebase.json
└── functions
    ├── fn_impl
    │   ├── __init__.py
    │   ├── foo.py
    │   └── bar.py
    ├── main.py
    └── requirements.txt

fn_impl: कोई भी नाम हो सकता है

__init__.py: ज़रूरी है, लेकिन इसे खाली छोड़ा जा सकता है

ग्रुप फ़ंक्शन

कई प्रोजेक्ट में, फ़ंक्शन को ऐसे लॉजिकल ग्रुप में बांटा जा सकता है जिन्हें इन्हें एक साथ डिप्लॉय और मैनेज किया जा सकता है. उदाहरण के लिए, आपके पास मेट्रिक की रिपोर्टिंग के लिए इस्तेमाल किए जाने वाले फ़ंक्शन:

metric.js


const functions = require('firebase-functions/v1');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

अपने index.js में इन फ़ंक्शन को एक्सपोर्ट करते समय, इन्हें किसी ग्रुप में रखा जा सकता है फ़ाइल:

index.js


// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

डिप्लॉय किए जाने पर, फ़ंक्शन के नाम से पहले उनके ग्रुप का नाम जोड़ा जाएगा, इसलिए इस उदाहरण में फ़ंक्शन का नाम metrics-usageStats होगा और metrics-nightlyReport.

फ़ंक्शन को डिप्लॉय करते समय, कार्रवाई को किसी एक ग्रुप तक सीमित किया जा सकता है:


firebase deploy --only functions:metrics

अगले चरण

Cloud Functions के बारे में ज़्यादा जानने के लिए, यहां देखें: