| भाषा चुनें: | 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" } }
इसके बाद, डिपेंडेंसी को फ़ंक्शन में इंपोर्ट किया जाता है:
JavaScript
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 मॉड्यूल भी शामिल किए जा सकते हैं. ऐसा करने के लिए, file: प्रीफ़िक्स का इस्तेमाल करके, package.json में अपने मॉड्यूल का एलान करें. यहां दिए गए उदाहरण में, 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 स्टेटमेंट का इस्तेमाल करें.
निजी मॉड्यूल का इस्तेमाल करना
निजी npm मॉड्यूल का इस्तेमाल किया जा सकता है. इसके लिए, फ़ंक्शन की डायरेक्ट्री में मौजूद .npmrc फ़ाइल में, रजिस्ट्री की मदद से पुष्टि करने की सेटिंग दें. अगर पैकेज मैनेजर के तौर पर 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एनवायरमेंट वैरिएबल को सेट किया जा सकता है. इसके लिए,gcloud functions deployकमांड में--set-build-env-varsआर्ग्युमेंट का इस्तेमाल करें. एनपीएम ऑथेंटिकेशन टोकन के बारे में ज़्यादा जानने के लिए, निजी मॉड्यूल पर एनपीएम ट्यूटोरियल देखें.
Python
Python में लिखे गए Cloud Functions के लिए डिपेंडेंसी तय करने के दो तरीके हैं: pip पैकेज मैनेजर की requirements.txt फ़ाइल का इस्तेमाल करना या अपने फ़ंक्शन के साथ लोकल डिपेंडेंसी को पैकेज करना.
Pipfile/Pipfile.lock स्टैंडर्ड का इस्तेमाल करके डिपेंडेंसी तय करने की सुविधा काम नहीं करती. आपके प्रोजेक्ट में ये फ़ाइलें शामिल नहीं होनी चाहिए.
pip की मदद से डिपेंडेंसी तय करना
Python में डिपेंडेंसी को pip की मदद से मैनेज किया जाता है. साथ ही, इन्हें requirements.txt नाम की मेटाडेटा फ़ाइल में दिखाया जाता है.
यह फ़ाइल उसी डायरेक्ट्री में होनी चाहिए जिसमें main.py फ़ाइल मौजूद है. इस फ़ाइल में आपके फ़ंक्शन का कोड होता है.
जब फ़ंक्शन को डिप्लॉय या फिर से डिप्लॉय किया जाता है, तो Cloud Functions, pip का इस्तेमाल करके आपकी डिपेंडेंसी के नए वर्शन को डाउनलोड और इंस्टॉल करता है. ऐसा requirements.txt फ़ाइल में बताए गए तरीके से किया जाता है.
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 पर ठीक से काम न करें.