जावास्क्रिप्ट के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन
आधुनिक वेब डेवलपमेंट में जावास्क्रिप्ट (Node.js) के साथ, यह सवाल तेजी से उठता है: जब आपके पास कई पैकेज, लाइब्रेरी या माइक्रोसर्विसेज हैं जो एक-दूसरे पर निर्भर हैं, तो कोड को प्रभावी ढंग से कैसे व्यवस्थित करें? अलग-अलग रिपॉजिटरी (multirepo) का पारंपरिक दृष्टिकोण कोड के दोहराव, संस्करणों के सिंक्रनाइज़ेशन में कठिनाइयों और लंबे CI/CD का कारण बन सकता है। समाधान है मोनोरिपॉजिटरी (monorepo)। इस लेख में, हम समझेंगे कि मोनोरिपॉजिटरी क्या है, इसकी आवश्यकता क्यों है, और जावास्क्रिप्ट का उपयोग करके इसे व्यवहार में कैसे व्यवस्थित किया जाए।
मोनोरिपॉजिटरी क्या है और इसकी आवश्यकता क्यों है?
मोनोरिपॉजिटरी एक दृष्टिकोण है जिसमें कई प्रोजेक्ट्स (पैकेज, लाइब्रेरी, सर्विसेज) का कोड एक ही रिपॉजिटरी में संग्रहीत किया जाता है। यह केवल "सब कुछ एक फ़ोल्डर में रखना" नहीं है, बल्कि एक सुविचारित आर्किटेक्चर है जो कई समस्याओं का समाधान करता है:
- निर्भरताओं का एकीकृत संस्करण: आप उस स्थिति से बचते हैं जहाँ विभिन्न पैकेजों में एक ही लाइब्रेरी के अलग-अलग संस्करणों का उपयोग किया जाता है।
- आसान रीफैक्टरिंग: सामान्य लाइब्रेरी में किए गए बदलाव तुरंत उन सभी प्रोजेक्ट्स में दिखाई देते हैं जो इसका उपयोग करते हैं।
- सरलीकृत CI/CD: एक रिपॉजिटरी - बिल्ड और टेस्टिंग का एक कॉन्फ़िगरेशन।
- कोड का साझा उपयोग: उपयोगिताएँ, प्रकार और कॉन्फ़िगरेशन npm में प्रकाशित किए बिना सभी पैकेजों के लिए उपलब्ध हैं।
हालाँकि, मोनोरिपॉजिटरी सभी के लिए उपयुक्त नहीं है। इसके लिए टीम में अनुशासन और अच्छे टूल की आवश्यकता होती है। जावास्क्रिप्ट (Node.js) के लिए, मुख्य टूल npm workspaces (npm 7+ में निर्मित) और Lerna (अधिक उन्नत टूल) हैं।
npm workspaces के साथ बेसिक मोनोरिपॉजिटरी सेट करना
चलिए एक सरल उदाहरण से शुरू करते हैं। मान लीजिए, हमारे पास एक प्रोजेक्ट है जिसमें दो पैकेज हैं: @myapp/core (व्यावसायिक तर्क के साथ कोर) और @myapp/server (Express पर सर्वर)।
फ़ोल्डर संरचना बनाएँ:
my-monorepo/├── packages/│ ├── core/│ │ ├── src/│ │ │ └── index.js│ │ ├── package.json│ │ └── ...│ └── server/│ ├── src/│ │ └── index.js│ ├── package.json│ └── ...├── package.json└── ...रूट package.json में workspaces फ़ील्ड होना चाहिए:
{ "name": "my-monorepo", "private": true, "workspaces": [ "packages/*" ], "scripts": { "start": "node packages/server/src/index.js", "test": "npm run test --workspaces" }}अब packages/core/package.json में:
{ "name": "@myapp/core", "version": "1.0.0", "main": "src/index.js"}और packages/server/package.json में core पर निर्भरता जोड़ें:
{ "name": "@myapp/server", "version": "1.0.0", "dependencies": { "@myapp/core": "*", "express": "^4.18.0" }}रूट में npm install चलाने के बाद, npm पैकेजों के बीच सिमलिंक बनाएगा। अब सर्वर कोड में हम सीधे core को इम्पोर्ट कर सकते हैं:
// packages/server/src/index.jsconst express = require('express');const { calculate } = require('@myapp/core');
const app = express();app.get('/', (req, res) => { res.send(calculate(2, 3));});app.listen(3000);यह एक बुनियादी उदाहरण है, लेकिन यह पहले से ही मुख्य लाभ दिखाता है: @myapp/core में बदलाव रजिस्ट्री में प्रकाशित किए बिना तुरंत @myapp/server में दिखाई देते हैं।
Lerna के साथ उन्नत संगठन
जब पैकेजों की संख्या 5-10 से अधिक हो जाती है, तो npm workspaces पर्याप्त नहीं हो सकता है। यहाँ Lerna मदद करता है - एक टूल जो शक्तिशाली क्षमताएँ जोड़ता है:
- सभी या चयनित पैकेजों में कमांड चलाना।
- संस्करणों का स्वचालित प्रबंधन (fixed या independent mode)।
- प