| भाषा चुनें: | 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 मॉड्यूल भी शामिल किए जा सकते हैं. इसके लिए,
package.json में अपने मॉड्यूल की जानकारी देकर,
file: प्रीफ़िक्स का इस्तेमाल करें. यहां दिए गए उदाहरण में, mymodule आपके मॉड्यूल के नाम को दिखाता है. वहीं, mymoduledir वह डायरेक्ट्री है जिसमें आपका मॉड्यूल मौजूद है:
{ "dependencies": { "mymodule": "file:mymoduledir" } }
इस स्थानीय मॉड्यूल का कोड, आपके फ़ंक्शन की रूट डायरेक्ट्री में मौजूद node_modules फ़ोल्डर के अलावा किसी दूसरी जगह पर सेव होना चाहिए.
TypeScript के लिए अतिरिक्त चरण
TypeScript, उन लाइब्रेरी का इस्तेमाल करने पर सबसे ज़्यादा काम आता है जिनमें टाइप की जानकारी होती है.
इससे TypeScript, सिंटैक्स से जुड़ी गड़बड़ियों को पकड़ पाता है. साथ ही, एडिटर आपको बेहतर तरीके से ऑटोकंप्लीट के सुझाव दे पाते हैं. firebase-admin और firebase-functions जैसी कुछ लाइब्रेरी में, TypeScript की डेफ़िनिशन शामिल होती हैं.
कई लाइब्रेरी, TypeScript की अपनी डेफ़िनिशन उपलब्ध नहीं कराती हैं. DefinitelyTyped प्रोजेक्ट, सबसे लोकप्रिय नोड लाइब्रेरी के लिए, कम्यूनिटी की ओर से मैनेज की जाने वाली डेफ़िनिशन उपलब्ध कराता है.
DefinitelyTyped, इन डेफ़िनिशन को उसी एनपीएम पैकेज के नाम से पब्लिश करता है. हालांकि, ये "@types" संगठन के तहत पब्लिश की जाती हैं. उदाहरण के लिए, uuid लाइब्रेरी के लिए टाइप की जानकारी इंस्टॉल करने के लिए, यह तरीका अपनाएं:
npm install @types/uuid
TypeScript के बारे में ज़्यादा जानने पर, आपको दोनों तरह के इंस्टॉलेशन को एक साथ इस्तेमाल करने की ज़रूरत पड़ सकती है:
npm install uuid @types/uuid
टाइप डिपेंडेंसी, लाइब्रेरी डिपेंडेंसी की तरह ही होनी चाहिए. उदाहरण के लिए, आपको uuid को सामान्य डिपेंडेंसी के तौर पर और @types/uuid को
dev डिपेंडेंसी या पीयर डिपेंडेंसी के तौर पर सेव नहीं करना चाहिए.
Node.js मॉड्यूल लोड करना
इंस्टॉल किए गए किसी भी Node.js मॉड्यूल को लोड करने के लिए, Node.js के
require()
फ़ंक्शन का इस्तेमाल करें. require() फ़ंक्शन का इस्तेमाल करके, उन स्थानीय फ़ाइलों को भी इंपोर्ट किया जा सकता है जिन्हें अपने फ़ंक्शन के साथ डिप्लॉय किया जाता है.
अगर TypeScript में फ़ंक्शन लिखे जा रहे हैं, तो इंस्टॉल किए गए किसी भी Node.js मॉड्यूल को लोड करने के लिए,
import
स्टेटमेंट का इस्तेमाल उसी तरह करें.
निजी मॉड्यूल का इस्तेमाल करना
फ़ंक्शन की डायरेक्ट्री में मौजूद .npmrc फ़ाइल में, रजिस्ट्री के साथ पुष्टि करने के लिए सेटिंग उपलब्ध कराकर, निजी एनपीएम मॉड्यूल का इस्तेमाल किया जा सकता है. अगर पैकेज मैनेजर के तौर पर
Yarn v2 या उससे नया वर्शन इस्तेमाल किया जा रहा है, तो इस फ़ाइल का नाम
.yarnrc.yml होगा.
Artifact Registry के निजी मॉड्यूल
Artifact Registry के Node.js पैकेज के डेटाबेस में, आपके फ़ंक्शन के लिए निजी मॉड्यूल होस्ट किए जा सकते हैं. Google Cloud Functions
का कोई फ़ंक्शन डिप्लॉय करने पर, बिल्ड प्रोसेस, Artifact Registry के क्रेडेंशियल
अपने-आप जनरेट करती है Cloud Build सेवा खातेके लिए.
आपको अतिरिक्त क्रेडेंशियल जनरेट किए बिना, सिर्फ़ अपने .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 या उससे नया वर्शन इस्तेमाल किया जा रहा है, तो आपको अतिरिक्त क्रेडेंशियल के बिना, सिर्फ़ अपने Artifact Registry
डेटाबेस की सूची अपने .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: आपके निजी
एनपीएम रजिस्ट्री का डोमेन नेम. अगर आपका डेटाबेस
npmjs.orgपर होस्ट किया गया है, तो इस फ़ील्ड कोregistry.npmjs.orgपर सेट करें. AUTH_TOKEN: आपकी एनपीएम रजिस्ट्री के लिए अनुमति देने वाला टोकन. यह टोकन की लिटरल टेक्स्ट वैल्यू या
${NPM_TOKEN}टेक्स्ट स्ट्रिंग हो सकती है.npm, इसे एनवायरमेंट से टोकन की असल वैल्यू से बदल देता है.gcloud functions deployकमांड में--set-build-env-varsआर्ग्युमेंट का इस्तेमाल करके,$NPM_TOKENएनवायरमेंट वैरिएबल सेट किया जा सकता है. एनपीएम के ऑथ टोकन के बारे में ज़्यादा जानकारी के लिए, निजी मॉड्यूल पर एनपीएम का ट्यूटोरियल देखें.
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
इसके बाद, localpackage से कोड को सामान्य तरीके से इंपोर्ट करने के लिए, import स्टेटमेंट का इस्तेमाल करें.
# Code in main.py from localpackage import script
ध्यान दें कि इस तरीके से, setup.py फ़ाइलें नहीं चलेंगी. इन फ़ाइलों वाले पैकेज को अब भी बंडल किया जा सकता है. हालांकि, हो सकता है कि ये Cloud Functions पर सही तरीके से न चलें.