Go के साथ मोनोरिपॉजिटरी: स्केलेबल प्रोजेक्ट्स के लिए कोड संगठन
आधुनिक सॉफ्टवेयर विकास में, यह सवाल तेजी से उठता है: कोड को कैसे व्यवस्थित किया जाए ताकि वह प्रबंधनीय, पुन: प्रयोज्य और स्केलेबल बना रहे? एक लोकप्रिय समाधान मोनोरिपॉजिटरी (monorepo) का उपयोग करना है - एक एकल रिपॉजिटरी जिसमें कई प्रोजेक्ट या सेवाएँ शामिल हों। इस लेख में, हम Go (Golang) भाषा में मोनोरिपॉजिटरी को प्रभावी ढंग से व्यवस्थित करने का तरीका समझेंगे, सर्वोत्तम प्रथाओं, निर्देशिका संरचना, मॉड्यूल के साथ काम करने और CI/CD सेटअप पर चर्चा करेंगे।
मोनोरिपॉजिटरी क्या है और Go में इसकी आवश्यकता क्यों है?
मोनोरिपॉजिटरी एक दृष्टिकोण है जिसमें कंपनी या बड़े प्रोजेक्ट का सारा कोड एक ही रिपॉजिटरी में संग्रहीत किया जाता है। इसमें शामिल हो सकते हैं:
- कई माइक्रोसर्विसेज
- लाइब्रेरी और उपयोगिताएँ
- कॉन्फ़िगरेशन और स्क्रिप्ट
- दस्तावेज़ीकरण
Go के लिए मोनोरिपॉजिटरी के लाभ:
- निर्भरताओं का एक समान संस्करण - सेवाओं के बीच संस्करण विरोध को समाप्त करता है।
- रीफैक्टरिंग को सरल बनाता है - सामान्य लाइब्रेरी में बदलाव सभी उपभोक्ताओं को तुरंत दिखाई देते हैं।
- कोड का आसान पुन: उपयोग - रजिस्ट्री में पैकेज प्रकाशित करने की आवश्यकता नहीं है।
- एक समान कमिट इतिहास - डिबगिंग और ऑडिट को सरल बनाता है।
हालाँकि, मोनोरिपॉजिटरी में अनुशासन की आवश्यकता होती है: स्पष्ट संरचना के बिना, यह जल्दी से "कबाड़खाना" बन जाता है। Go अपनी सख्त मॉड्यूल प्रणाली (Go Modules) के साथ ऐसे रिपॉजिटरी को व्यवस्थित करने के लिए उत्कृष्ट उपकरण प्रदान करता है।
Go मोनोरिपॉजिटरी में निर्देशिका संरचना
सही संरचना सफलता का आधार है। Go में मोनोरिपॉजिटरी के लिए अनुशंसित संगठन पर विचार करें:
my-monorepo/├── apps/ # एप्लिकेशन (सेवाएँ, CLI उपयोगिताएँ)│ ├── api-gateway/│ │ ├── cmd/│ │ │ └── main.go│ │ ├── internal/│ │ ├── go.mod│ │ └── go.sum│ ├── auth-service/│ │ └── ...│ └── user-service/│ └── ...├── libs/ # सामान्य लाइब्रेरी│ ├── common/│ │ ├── logger.go│ │ ├── config.go│ │ ├── go.mod│ │ └── go.sum│ └── models/│ ├── user.go│ ├── go.mod│ └── go.sum├── scripts/ # बिल्ड, डिप्लॉय स्क्रिप्ट│ ├── build.sh│ └── deploy.sh├── docs/ # दस्तावेज़ीकरण├── .github/ # CI/CD कॉन्फ़िगरेशन│ └── workflows/│ └── ci.yml├── go.work # Workspace फ़ाइल (Go 1.18+)├── Makefile # सामान्य कमांड├── README.md└── .gitignoreसंरचना के प्रमुख तत्व:
- apps/ - इसमें निष्पादन योग्य एप्लिकेशन (सेवाएँ, उपयोगिताएँ) शामिल हैं। प्रत्येक एप्लिकेशन अपने स्वयं के
go.modके साथ एक अलग Go मॉड्यूल है। - libs/ - सामान्य लाइब्रेरी जो एप्लिकेशन के बीच पुन: उपयोग की जाती हैं।
- go.work - workspace फ़ाइल, जो बदलावों को प्रकाशित किए बिना सभी मॉड्यूल के साथ स्थानीय रूप से काम करने की अनुमति देती है।
मोनोरिपॉजिटरी में Go Modules के साथ काम करना
Go 1.18 से शुरू करके, workspaces (go.work) के लिए समर्थन जोड़ा गया। यह स्थानीय विकास की समस्या को हल करता है जब मॉड्यूल एक-दूसरे पर निर्भर होते हैं। सेटअप का एक उदाहरण देखें।
मोनोरिपॉजिटरी की जड़ में एक go.work फ़ाइल बनाएँ:
go 1.21
use ( ./apps/api-gateway ./apps/auth-service ./libs/common ./libs/models)अब स्थानीय विकास के दौरान, Go प्रकाशित संस्करणों के बजाय मॉड्यूल के स्थानीय संस्करणों का उपयोग करेगा। तेज़ पुनरावृत्ति के लिए यह महत्वपूर्ण है।
apps/auth-service/go.mod में निर्भरता का उदाहरण:
module github.com/company/auth-service
go 1.21
require ( github.com/company/libs/common v0.0.0 github.com/company/libs/model