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

भाषा चुनें: 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, इन परिभाषाओं को उसी 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 पर सही तरीके से काम न करें.