Cloud Functions को अपने प्रोजेक्ट में इंटिग्रेट करने पर, आपका कोड कई इंडिपेंडेंट फ़ंक्शन शामिल करने के लिए बढ़ सकता है. ऐसा हो सकता है कि आपके पास इतने फ़ंक्शन हों कि उन्हें एक फ़ाइल में रखना मुश्किल हो. इसके अलावा, अलग-अलग टीमें, फ़ंक्शन के अलग-अलग ग्रुप डिप्लॉय कर सकती हैं. इससे, एक टीम के फ़ंक्शन को दूसरी टीम के फ़ंक्शन से ओवरराइट या गलती से मिटाने का खतरा हो सकता है. Cloud Functions, आपके कोड को व्यवस्थित करने के अलग-अलग तरीके उपलब्ध कराता है. इससे, आपके फ़ंक्शन को नेविगेट करना और बनाए रखना आसान हो जाता है.
कोडबेस में फ़ंक्शन व्यवस्थित करना
एक ही रिपॉज़िटरी मोनोरिपो सेटअप में, कई रिपॉज़िटरी या सब-पैकेज में मौजूद फ़ंक्शन के बड़े कलेक्शन को मैनेज करने के लिए, firebase.json में फ़ंक्शन कॉन्फ़िगरेशन ऑब्जेक्ट की codebase प्रॉपर्टी का इस्तेमाल किया जा सकता है:
# 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 CLI के वर्शन 10.7.1 और इसके बाद के वर्शन में काम करती है.
कई रिपॉज़िटरी मैनेज करना
codebase प्रॉपर्टी, कई रिपॉज़िटरी को मैनेज करने की प्रोसेस को आसान बना सकती है. आइए, एक ऐसे मामले की जांच करें जिसमें आपके पास दो अलग-अलग रिपॉज़िटरी हैं. ये दोनों, एक ही Firebase प्रोजेक्ट में फ़ंक्शन डिप्लॉय करती हैं:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
कोडबेस एनोटेशन के बिना, Firebase CLI ने आपको डिप्लॉय के समय, दूसरी रिपॉज़िटरी में तय किए गए फ़ंक्शन मिटाने के लिए कहा होगा:
$ (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 CLI अब आपको अपनी मौजूदा रिपॉज़िटरी के बाहर तय किए गए फ़ंक्शन मिटाने के लिए नहीं कहता:
$ (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 CLI, डिप्लॉय के एक ही कमांड में सभी पैकेज से फ़ंक्शन डिप्लॉय करता है:
$ 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 का इस्तेमाल शुरू करते समय, हो सकता है कि आपने अपने पहले कुछ फ़ंक्शन एक ही फ़ाइल में लिखे हों: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: यह ज़रूरी है, लेकिन इसे खाली छोड़ा जा सकता है
फ़ंक्शन ग्रुप करना
कई प्रोजेक्ट में, फ़ंक्शन को लॉजिकल ग्रुप में बांटा जा सकता है. इन्हें एक साथ डिप्लॉय और मैनेज किया जाना चाहिए. उदाहरण के लिए, आपके पास मेट्रिक की रिपोर्टिंग के लिए इस्तेमाल किए जाने वाले फ़ंक्शन का ग्रुप हो सकता है:
metrics.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 के बारे में ज़्यादा जानने के लिए, ये लेख पढ़ें: