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

ভাষা বেছে নিন: 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 লাইব্রেরির জন্য টাইপ তথ্য ইনস্টল করতে পারেন:

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 এনভায়রনমেন্ট থেকে আসল টোকেন ভ্যালু দিয়ে পরিবর্তন করে।

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


Python

Python-এ লেখা Cloud Functions-এর জন্য ডিপেন্ডেন্সি নির্দিষ্ট করার দুটি উপায় আছে: 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

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

# Code in main.py
from localpackage import script

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