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

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

    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 पर ठीक से काम न करें.