নির্ভরতা হ্যান্ডলিং

ভাষা নির্বাচন করুন: নোড.জেএস পাইথন

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

নোড.জেএস

একটি ফাংশন স্থানীয় ডেটার পাশাপাশি বাহ্যিক Node.js মডিউলও ব্যবহার করতে পারে। Node.js-এ ডিপেন্ডেন্সিগুলো npm দিয়ে পরিচালিত হয় এবং package.json নামক একটি মেটাডেটা ফাইলে প্রকাশ করা হয়। ক্লাউড ফাংশনস 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")}!`);
});

টাইপস্ক্রিপ্ট

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 ফোল্ডারটি ছাড়া অন্য কোনো স্থানে সংরক্ষণ করা উচিত।

টাইপস্ক্রিপ্টের জন্য অতিরিক্ত পদক্ষেপ

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

অনেক লাইব্রেরি তাদের নিজস্ব টাইপস্ক্রিপ্ট ডেফিনিশন প্রদান করে না। DefinitelyTyped প্রজেক্টটি সবচেয়ে জনপ্রিয় নোড লাইব্রেরিগুলোর জন্য কমিউনিটি দ্বারা পরিচালিত ডেফিনিশন সরবরাহ করে। DefinitelyTyped এই ডেফিনিশনগুলো একই NPM প্যাকেজ নামে, কিন্তু "@types" অর্গানাইজেশনের অধীনে প্রকাশ করে। উদাহরণস্বরূপ, আপনি নিম্নলিখিত কমান্ডের মাধ্যমে uuid লাইব্রেরির টাইপ ইনফরমেশন ইনস্টল করতে পারেন:

npm install @types/uuid

টাইপস্ক্রিপ্টের সাথে আপনি যতই পরিচিত হবেন, ততই হয়তো দেখবেন যে আপনি দুটি ইনস্টলকেই একত্রিত করছেন:

npm install uuid @types/uuid

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

Node.js মডিউল লোড হচ্ছে

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

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

ব্যক্তিগত মডিউল ব্যবহার করে

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

আর্টিফ্যাক্ট রেজিস্ট্রি থেকে ব্যক্তিগত মডিউল

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

@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 ফাইলে শুধু আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরিটি তালিকাভুক্ত করতে হবে। উদাহরণস্বরূপ:

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

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

এনপিএম ডকুমেন্টেশনে কাস্টম রিড-অনলি অ্যাক্সেস টোকেন তৈরি করার পদ্ধতি ব্যাখ্যা করা আছে। আমরা হোম ডিরেক্টরিতে তৈরি করা .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 অথ টোকেন সম্পর্কে আরও বিস্তারিত জানতে প্রাইভেট মডিউলের উপর NPM টিউটোরিয়ালটি দেখুন।


পাইথন

পাইথনে লেখা Cloud Functions জন্য ডিপেন্ডেন্সি নির্দিষ্ট করার দুটি উপায় আছে: pip প্যাকেজ ম্যানেজারের requirements.txt ফাইল ব্যবহার করা অথবা আপনার ফাংশনের সাথে লোকাল ডিপেন্ডেন্সিগুলো প্যাকেজ করা।

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

pip দিয়ে নির্ভরতা নির্দিষ্ট করা

পাইথনে ডিপেন্ডেন্সিগুলো pip দিয়ে পরিচালনা করা হয় এবং requirements.txt নামের একটি মেটাডেটা ফাইলে প্রকাশ করা হয়। এই ফাইলটি অবশ্যই main.py ফাইলের সাথে একই ডিরেক্টরিতে থাকতে হবে, যে ফাইলে আপনার ফাংশন কোড থাকে।

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

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

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

functions-framework
requests==2.20.0
numpy

স্থানীয় নির্ভরতা প্যাকেজিং

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

উদাহরণস্বরূপ, আপনি নিম্নলিখিতের মতো একটি ডিরেক্টরি কাঠামো ব্যবহার করতে পারেন:

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

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

# Code in main.py
from localpackage import script

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