किसी फ़ंक्शन में, स्थानीय डेटा के साथ-साथ बाहरी 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()
फ़ंक्शन का इस्तेमाल भी किया जा सकता है.
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 बिल्ड एनवायरमेंट वैरिएबल का इस्तेमाल किया है.
वेंडर की डिपेंडेंसी के लिए ज़रूरी शर्तें
पक्का करें कि आपके पास काम करने वाला ऐसा फ़ंक्शन हो जिसमें वे सभी डिपेंडेंसी शामिल हों जिन्हें आपको अपनी
package.json
फ़ाइल में वेंडर के तौर पर तय करना है.इन डिपेंडेंसी को स्थानीय तौर पर इंस्टॉल करने के लिए,
npm install
अपनी वर्किंग डायरेक्ट्री में मौजूद .gcloudignore फ़ाइल से
node_modules
को हटाएं.फ़ंक्शन को डिप्लॉय करें. साथ ही, पक्का करें कि आपके लोकल Node.js वर्शन और डिप्लॉयमेंट के दौरान बताए गए वर्शन में कोई अंतर न हो.
अपने फ़ंक्शन और वेंडर की डिपेंडेंसी को डिप्लॉय करने के लिए, यह कमांड इस्तेमाल करें:
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 फ़ाइल से हटाएं.