একাধিক ফাংশন (১ম জেনারেশন) সাজানো

আপনার প্রোজেক্টে 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.
}

Firebase CLI v10.7.1 ও এর পরবর্তী যেকোনও ভার্সনে codebase প্রপার্টি কাজ করে।

একাধিক রেপোজিটরি ম্যানেজ করা

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 ব্যবহার শুরু করার সময়, আপনি হয়ত প্রথম কয়েকটি ফাংশন একটি ফাইলে রাখবেন:

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 সম্পর্কে আরও জানতে, এগুলি দেখুন: