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

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

Cloud Functions में लिखे गए Python के लिए डिपेंडेंसी तय करने के दो तरीके हैं: pip पैकेज मैनेजर की requirements.txt फ़ाइल का इस्तेमाल करना या अपने फ़ंक्शन के साथ स्थानीय डिपेंडेंसी को पैकेज करना.

Pipfile/Pipfile.lock स्टैंडर्ड का इस्तेमाल करके, डिपेंडेंसी तय करने की सुविधा उपलब्ध नहीं है. आपके प्रोजेक्ट में ये फ़ाइलें शामिल नहीं होनी चाहिए.

pip की मदद से डिपेंडेंसी तय करना

Python में डिपेंडेंसी को pip की मदद से मैनेज किया जाता है. साथ ही, इन्हें called 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 पर सही तरीके से न चलें.