| ভাষা বেছে নিন: | 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-এ সঠিকভাবে নাও চলতে পারে।