डिपेंडेंसी हैंडल करना

भाषा चुनें: 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 को सिंटैक्स से जुड़ी गड़बड़ियों का पता लगाने में मदद मिलती है. साथ ही, एडिटर आपको बेहतर ऑटोकंप्लीट सुझाव दे पाते हैं. कुछ लाइब्रेरी, जैसे कि firebase-admin और firebase-functions, TypeScript की परिभाषाओं के साथ शिप की जाती हैं.

कई लाइब्रेरी, अपनी TypeScript डेफ़िनिशन नहीं देती हैं. DefinitelyTyped प्रोजेक्ट, सबसे लोकप्रिय नोड लाइब्रेरी के लिए कम्यूनिटी के ज़रिए बनाए गए डेफ़िनिशन उपलब्ध कराता है. DefinitelyTyped, इन परिभाषाओं को एक ही एनपीएम पैकेज के नाम से पब्लिश करता है. हालांकि, यह "@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 क्रेडेंशियल अपने-आप जनरेट करती है. आपको सिर्फ़ Artifact Registry रिपॉज़िटरी को अपने .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 में सिर्फ़ 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, एनवायरमेंट से मिली टोकन की असल वैल्यू से बदलता है.

    gcloud functions deploy कमांड के --set-build-env-vars आर्ग्युमेंट की मदद से, $NPM_TOKEN एनवायरमेंट वैरिएबल सेट किया जा सकता है. NPM के पुष्टि करने वाले टोकन के बारे में ज़्यादा जानने के लिए, निजी मॉड्यूल पर NPM ट्यूटोरियल देखें.


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

इसके बाद, localpackage से कोड को सामान्य तरीके से इंपोर्ट किया जा सकता है. इसके लिए, यहां दिया गया import स्टेटमेंट इस्तेमाल करें.

# Code in main.py
from localpackage import script

ध्यान दें कि इस तरीके से, कोई भी setup.py फ़ाइल नहीं चलेगी. इन फ़ाइलों वाले पैकेज अब भी बंडल किए जा सकते हैं. हालांकि, ऐसा हो सकता है कि वे Cloud Functions पर ठीक से काम न करें.