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


किसी फ़ंक्शन में, स्थानीय डेटा के साथ-साथ बाहरी 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 escapeHtml = require('escape-html');

// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});

TypeScript

import * as escapeHtml from 'escape-html';

// Return a greeting with the input HTML-escaped.
export let hello = functions.https.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 सबसे ज़्यादा मददगार होता है. इससे 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 सेवा खाते के लिए, आर्टफ़ैक्ट रजिस्ट्री के क्रेडेंशियल अपने-आप जनरेट करती है. आपको अपने .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 में आर्टफ़ैक्ट रजिस्ट्री रिपॉज़िटरी को शामिल करना होगा. इसके लिए, आपको अलग से क्रेडेंशियल डालने की ज़रूरत नहीं है. उदाहरण के लिए:

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 को एनवायरमेंट से टोकन की असल वैल्यू से बदल देता है.

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

वेंडर की डिपेंडेंसी की मदद से फ़ंक्शन बनाना

वेंडर की डिपेंडेंसी वे होती हैं जिनका सोर्स सीधे आपके सोर्स कोड पैकेज में शामिल होता है और जिन्हें आपके कोड के साथ फिर से बनाया जाता है. आपने वेंडर की Node.js डिपेंडेंसी बनाई हैं और डिप्लॉयमेंट के दौरान उन्हें इंस्टॉल करने से बचाने के लिए, GOOGLE_VENDOR_NPM_DEPENDENCIES बिल्ड एनवायरमेंट वैरिएबल का इस्तेमाल किया है.

वेंडर की डिपेंडेंसी के लिए ज़रूरी शर्तें

  1. पक्का करें कि आपके पास काम करने वाला ऐसा फ़ंक्शन हो जिसमें वे सभी डिपेंडेंसी शामिल हों जिन्हें आपको अपनी package.json फ़ाइल में वेंडर के तौर पर तय करना है.

  2. इन डिपेंडेंसी को स्थानीय तौर पर इंस्टॉल करने के लिए,

        npm install
    
  3. अपनी वर्किंग डायरेक्ट्री में मौजूद .gcloudignore फ़ाइल से node_modules को हटाएं.

  4. फ़ंक्शन को डिप्लॉय करें. साथ ही, पक्का करें कि आपके लोकल Node.js वर्शन और डिप्लॉयमेंट के दौरान बताए गए वर्शन में कोई अंतर न हो.

  5. अपने फ़ंक्शन और वेंडर की डिपेंडेंसी को डिप्लॉय करने के लिए, यह कमांड इस्तेमाल करें:

      gcloud functions deploy FUNCTION_NAME \
        --runtime RUNTIME_NAME \
        --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true
    

    बदलें:

    • FUNCTION_NAME: उस Cloud Functions फ़ंक्शन का नाम जिसे डिप्लॉय किया जा रहा है
    • RUNTIME_NAME: डिप्लॉय किए गए फ़ंक्शन को चलाने के लिए, Node.js रनटाइम का नाम. यह वही Node.js वर्शन होना चाहिए जिसका इस्तेमाल आपने अपने लोकल डेवलपमेंट एनवायरमेंट में किया है

फ़ंक्शन के लिए, Functions फ़्रेमवर्क पैकेज की ज़रूरत होती है. तेज़ी से बिल्ड करने के लिए, हमारा सुझाव है कि इस पैकेज को वेंडर के तौर पर इस्तेमाल करें. अगर ऐसा नहीं किया जाता है, तो फ़ंक्शन बनने के बाद इसे डाउनलोड और इंस्टॉल किया जाता है.

अगर package.json फ़ाइल में कोई npm इंजन तय किया जाता है, तो बिल्ड के समय npm का तय किया गया वर्शन डाउनलोड किया जाता है. इस गड़बड़ी को ठीक करने के लिए, इसे अपनी package.json फ़ाइल से हटाएं.