একাধিক ফাংশন সংগঠিত

আপনি যখন আপনার প্রোজেক্টে ক্লাউড ফাংশনস যুক্ত করবেন, তখন আপনার কোড প্রসারিত হয়ে অনেকগুলো স্বতন্ত্র ফাংশন ধারণ করতে পারে। একটি ফাইলে যুক্তিসঙ্গতভাবে রাখার জন্য আপনার ফাংশনের সংখ্যা অনেক বেশি হয়ে যেতে পারে, অথবা বিভিন্ন টিম ফাংশনের ভিন্ন ভিন্ন গ্রুপ ডেপ্লয় করতে পারে, যা একটি টিমের দ্বারা অন্য টিমের ফাংশন ওভাররাইট বা ভুলবশত মুছে ফেলার ঝুঁকি তৈরি করে। ক্লাউড ফাংশনস আপনার কোডকে গুছিয়ে রাখার জন্য বিভিন্ন উপায় প্রদান করে, যা আপনার ফাংশনগুলো নেভিগেট করা এবং রক্ষণাবেক্ষণ করাকে সহজ করে তোলে।

কোডবেসে ফাংশনগুলো সংগঠিত করুন

একটি একক রিপোজিটরি (monorepo) সেটআপের মধ্যে একাধিক রিপোজিটরি বা সাব-প্যাকেজ জুড়ে থাকা বিপুল সংখ্যক ফাংশন পরিচালনা করার জন্য, আপনি firebase.json এর functions কনফিগারেশন অবজেক্টের 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 v10.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 ফাইলের functions configuration সেকশনে একটি স্বতন্ত্র codebase annotation যোগ করে আপনি এই সমস্যাটি এড়াতে পারেন:

# 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 প্রপার্টি একটিমাত্র রিপোজিটরিতে একাধিক সোর্স প্যাকেজের ব্যবস্থাপনা সহজ করতে সাহায্য করতে পারে। আসুন এমন একটি পরিস্থিতি বিবেচনা করা যাক যেখানে আপনার একটি ফায়ারবেস প্রজেক্ট ডিরেক্টরি রয়েছে এবং সেই ডিরেক্টরির ফাংশন ডেফিনিশনগুলো বিভিন্ন সাব-প্যাকেজে ছড়িয়ে আছে:

$  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!")

কয়েকটির বেশি ফাংশন থাকলে এটি পরিচালনা করা কঠিন হয়ে পড়তে পারে। এর পরিবর্তে, আপনি প্রতিটি ফাংশনের সমস্ত লজিক তার নিজস্ব ফাইলে রাখতে পারেন এবং আপনার সোর্স ফাইলটিকে এক্সপোর্টের তালিকা হিসেবে ব্যবহার করতে পারেন:

নোড.জেএস

foo.js

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

বার.জেএস

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;

পাইথন

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!")

বার.পাই

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