ডিপেন্ডেন্সি ম্যানেজ করা

ভাষা বেছে নিন: Node.js Python

Cloud Functions ফাংশন এক্সটার্নাল মডিউল ও লোকাল ডিপেন্ডেন্সি ব্যবহার করতে পারে। আপনি কীভাবে নির্ভরতা নির্দিষ্ট ও ম্যানেজ করবেন তা আপনার রানটাইম ভাষার উপর নির্ভর করে।

Node.js

কোনও ফাংশন এক্সটার্নাল Node.js মডিউল ও লোকাল ডেটা ব্যবহার করতে পারে। Node.js-এ ডিপেন্ডেন্সি npm-এর মাধ্যমে ম্যানেজ করা হয় এবং তা package.json নামের মেটাডেটা ফাইলে উল্লেখ করা থাকে। Cloud Functions Node.js রানটাইম npm, yarn বা pnpm ব্যবহার করে ইনস্টল করা যায়।

আপনার ফাংশনের জন্য কোনও ডিপেন্ডেন্সি নির্দিষ্ট করতে, এটি আপনার package.json ফাইলে যোগ করুন।

এই উদাহরণে, package.json ফাইলে একটি নির্ভরতা তালিকাভুক্ত করা হয়েছে:

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

তারপরে, ফাংশনে ডিপেন্ডেন্সি ইমপোর্ট করা হয়:

জাভাস্ক্রিপ্ট

const onRequest = require("firebase-functions/https");
const escapeHtml = require("escape-html");

// Return a greeting with the input HTML-escaped.
exports.hello = onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});

TypeScript

import { onRequest } from "firebase-functions/https";
import * as escapeHtml from "escape-html";

// Return a greeting with the input HTML-escaped.
export let hello = onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});

স্থানীয় Node.js মডিউল সহ

এছাড়াও, আপনি নিজের ফাংশনের অংশ হিসেবে লোকাল Node.js মডিউল অন্তর্ভুক্ত করতে পারবেন। package.json ব্যবহার করে file: প্রিফিক্স ঘোষণা করে আপনি এটি করতে পারেন। নিচের উদাহরণে, mymodule হল আপনার মডিউলের নাম এবং mymoduledir হল সেই ডিরেক্টরি যেখানে আপনার মডিউল আছে:

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

এই লোকাল মডিউলের কোডটি আপনার ফাংশনের রুট ডিরেক্টরির মধ্যে node_modules ফোল্ডার ছাড়া অন্য কোথাও স্টোর করতে হবে।

TypeScript-এর জন্য অতিরিক্ত ধাপ

টাইপ সংক্রান্ত তথ্য আছে এমন লাইব্রেরি ব্যবহার করলে TypeScript আপনাকে সবচেয়ে বেশি সাহায্য করে। এর ফলে TypeScript সিনট্যাক্স সংক্রান্ত সমস্যা ধরতে পারে এবং এডিটর আপনাকে আরও ভালো অটো-কমপ্লিট সাজেশন দিতে পারে। firebase-admin এবং firebase-functions-এর মতো কিছু লাইব্রেরিতে TypeScript সংজ্ঞা অন্তর্ভুক্ত থাকে।

অনেক লাইব্রেরি তাদের নিজস্ব TypeScript সংজ্ঞা প্রদান করে না। DefinitelyTyped প্রোজেক্ট সবচেয়ে জনপ্রিয় নোড লাইব্রেরির জন্য কমিউনিটি-ম্যানেজড সংজ্ঞা প্রদান করে। DefinitelyTyped একই NPM প্যাকেজের নামে এইসব সংজ্ঞা প্রকাশ করে, কিন্তু "@types" সংস্থার মধ্যে। যেমন, আপনি নিম্নলিখিত কমান্ডের মাধ্যমে uuid লাইব্রেরির জন্য type information ইনস্টল করতে পারবেন:

npm install @types/uuid

TypeScript-এর সাথে পরিচিত হওয়ার সাথে সাথে, আপনি হয়ত দুটি ইনস্টল করার পদ্ধতিই একসাথে ব্যবহার করতে চাইবেন:

npm install uuid @types/uuid

লাইব্রেরি নির্ভরতার মতো টাইপ নির্ভরতাও একই ধরনের হতে হবে। যেমন, uuid-কে সাধারণ ডিপেন্ডেন্সি এবং @types/uuid-কে ডেভ ডিপেন্ডেন্সি বা পিয়ার ডিপেন্ডেন্সি হিসেবে সেভ করা উচিত নয়।

Node.js মডিউল লোড করা

আপনার ইনস্টল করা যেকোনও Node.js মডিউল লোড করতে Node.js require() ফাংশন ব্যবহার করুন। এছাড়াও, আপনার ফাংশনের সাথে ডিপ্লয় করা লোকাল ফাইল ইমপোর্ট করতে require() ফাংশন ব্যবহার করতে পারবেন।

আপনি TypeScript-এ ফাংশন লিখলে, আপনার ইনস্টল করা যেকোনও Node.js মডিউল লোড করতে একই পদ্ধতিতে import স্টেটমেন্ট ব্যবহার করুন।

প্রাইভেট মডিউল ব্যবহার করা

ফাংশনের ডিরেক্টরিতে .npmrc ফাইলে রেজিস্ট্রির সাথে যাচাইকরণের জন্য সেটিংস প্রদান করে আপনি ব্যক্তিগত npm মডিউল ব্যবহার করতে পারেন। আপনি যদি Yarn v2 বা তার পরের যেকোনও ভার্সন প্যাকেজ ম্যানেজার হিসেবে ব্যবহার করেন, তাহলে এই ফাইলের নাম .yarnrc.yml।

Artifact Registry থেকে ব্যক্তিগত মডিউল

Artifact Registry Node.js প্যাকেজ রিপোজিটরি আপনার ফাংশনের জন্য ব্যক্তিগত মডিউল হোস্ট করতে পারে। আপনি কোনও Google Cloud Functions ফাংশন ডিপ্লয় করলে, বিল্ড প্রসেস অটোমেটিক Cloud Build পরিষেবা অ্যাকাউন্টের জন্য Artifact Registry ক্রেডেনশিয়াল তৈরি করে। আপনাকে শুধু অতিরিক্ত ক্রেডেনশিয়াল তৈরি না করেই .npmrc-এ Artifact Registry রিপোজিটরি তালিকাভুক্ত করতে হবে। যেমন:

@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true

এই পদ্ধতি Yarn v1 প্যাকেজ ম্যানেজারের ক্ষেত্রেও কাজ করে। আপনি Yarn v2 বা তার পরের যেকোনও ভার্সন ব্যবহার করলে, আপনাকে অতিরিক্ত ক্রেডেনশিয়াল ছাড়াই নিজের .yarnrc.yml-এ Artifact Registry রেপোজিটরি তালিকাভুক্ত করতে হবে। যেমন:

npmScopes:
  SCOPE:
    npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
    npmAlwaysAuth: true

অন্যান্য রিপোজিটরি থেকে ব্যক্তিগত মডিউল

npm ডকুমেন্টেশন থেকে কীভাবে কাস্টম শুধু-পঠনযোগ্য অ্যাক্সেস টোকেন তৈরি করতে হয় তা জানুন। আমরা হোম ডিরেক্টরিতে তৈরি করা .npmrc ফাইল ব্যবহার করতে বারণ করি, কারণ এতে রিড-রাইট টোকেন থাকে। ডেপ্লয়মেন্টের সময় লেখার অনুমতি প্রয়োজন হয় না এবং এটি নিরাপত্তা সংক্রান্ত ঝুঁকি তৈরি করতে পারে।

আপনি ব্যক্তিগত রিপোজিটরি ব্যবহার না করলে, .npmrc ফাইল অন্তর্ভুক্ত করবেন না, কারণ এটি আপনার ফাংশন ডিপ্লয় করার সময় বাড়িয়ে দিতে পারে।

ফাইল ফর্ম্যাট

আপনি কাস্টম অথ টোকেন সেট করার জন্য .npmrc ফাইল ব্যবহার করলে, এতে নিচে দেখানো লাইনটি থাকতে হবে।

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

পরিবর্তন করুন:

  • REGISTRY_DOMAIN: আপনার ব্যক্তিগত npm রেজিস্ট্রি। আপনার রিপোজিটরি npmjs.org-এর সাথে হোস্ট করা হলে, এই ফিল্ডটি registry.npmjs.org হিসেবে সেট করুন।
  • AUTH_TOKEN: আপনার npm রেজিস্ট্রি সংক্রান্ত অনুমোদনের টোকেন। এটি টোকেনের আক্ষরিক টেক্সট ভ্যালু বা টেক্সট স্ট্রিং ${NPM_TOKEN} হতে পারে, যা npm এনভায়রনমেন্ট থেকে পাওয়া আসল টোকেন ভ্যালু দিয়ে পরিবর্তন করা হয়।

    আপনি gcloud functions deploy কমান্ডে --set-build-env-vars আর্গুমেন্ট সহ $NPM_TOKEN এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারবেন। NPM auth টোকেনের আরও বিবরণের জন্য প্রাইভেট মডিউল সংক্রান্ত NPM টিউটোরিয়াল দেখুন।


Python

Cloud FunctionsPython-এ লেখা ফাংশনের জন্য নির্ভরতা নির্দিষ্ট করার দুটি উপায় রয়েছে: pip প্যাকেজ ম্যানেজারের requirements.txt ফাইল ব্যবহার করা বা আপনার ফাংশনের সাথে স্থানীয় নির্ভরতা প্যাকেজ করা।

Pipfile/Pipfile.lock স্ট্যান্ডার্ড ব্যবহার করে ডিপেন্ডেন্সি স্পেসিফিকেশন কাজ করে না। আপনার প্রোজেক্টে এইসব ফাইল অন্তর্ভুক্ত করা উচিত নয়।

pip-এর মাধ্যমে নির্ভরতা নির্দিষ্ট করা

Python-এ pip-এর সাহায্যে ডিপেন্ডেন্সি ম্যানেজ করা হয় এবং তা requirements.txt নামের মেটাডেটা ফাইলে লেখা থাকে। এই ফাইলটি অবশ্যই main.py ফাইলের মতো একই ডিরেক্টরিতে থাকতে হবে, যেখানে আপনার ফাংশন কোড আছে।

আপনি ফাংশন ডেপ্লয় বা রিডেপ্লয় করলে, Cloud Functions requirements.txt ফাইলে ঘোষণা করা আপনার ডিপেন্ডেন্সির লেটেস্ট ভার্সন ডাউনলোড ও ইনস্টল করতে pip ব্যবহার করে। requirements.txt ফাইলে প্রতিটি প্যাকেজের জন্য একটি করে লাইন থাকে। প্রতিটি লাইনে প্যাকেজের নাম এবং ঐচ্ছিকভাবে, অনুরোধ করা ভার্সন থাকে। আরও বিবরণের জন্য, requirements.txt রেফারেন্স দেখুন।

ডিপেন্ডেন্সি ভার্সনে পরিবর্তনের ফলে আপনার বিল্ড যাতে প্রভাবিত না হয়, তার জন্য নির্দিষ্ট ভার্সনে ডিপেন্ডেন্সি প্যাকেজ পিন করার কথা বিবেচনা করুন।

নিম্নলিখিত requirements.txt ফাইলটি একটি উদাহরণ:

functions-framework
requests==2.20.0
numpy

স্থানীয় ডিপেন্ডেন্সি প্যাকেজ করা

এছাড়াও, আপনার ফাংশনের সাথে সাথে আপনি ডিপেন্ডেন্সি প্যাকেজ ও ডেপ্লয় করতে পারবেন। আপনার ডিপেন্ডেন্সি যদি pip প্যাকেজ ম্যানেজারের মাধ্যমে উপলভ্য না হয় বা আপনার Cloud Functions এনভায়রনমেন্টের ইন্টারনেট অ্যাক্সেস সীমাবদ্ধ থাকে, তাহলে এই পদ্ধতিটি কাজে লাগে।

যেমন, আপনি হয়ত এই ধরনের ডিরেক্টরি স্ট্রাকচার ব্যবহার করতে পারেন:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

তারপরে, আপনি localpackage থেকে নিম্নলিখিত import বিবৃতি ব্যবহার করে স্বাভাবিকভাবে কোড ইমপোর্ট করতে পারবেন।

# Code in main.py
from localpackage import script

মনে রাখবেন, এই পদ্ধতিতে কোনও setup.py ফাইল রান করানো হবে না। সেইসব ফাইল সহ প্যাকেজ এখনও বান্ডেল করা যাবে, তবে Cloud Functions-এ সঠিকভাবে রান নাও করতে পারে।