Go के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन
मोनोरिपॉजिटरी (monorepo) कोड प्रबंधन का एक दृष्टिकोण है, जिसमें सभी प्रोजेक्ट, लाइब्रेरी और सेवाएँ एक ही रिपॉजिटरी में संग्रहीत की जाती हैं। Go समुदाय में यह दृष्टिकोण अपनी सरलता और दक्षता के कारण लोकप्रियता प्राप्त कर रहा है। इस लेख में, हम व्यवहार में मोनोरिपॉजिटरी में Go प्रोजेक्ट को व्यवस्थित करने के तरीके पर चर्चा करेंगे: संरचना चुनने से लेकर CI/CD सेट अप करने तक।
Go के लिए मोनोरिपॉजिटरी क्यों?
Go को मूल रूप से बड़े कोड बेस के लिए एक भाषा के रूप में डिज़ाइन किया गया था। go mod और go work जैसे उपकरण मोनोरिपॉजिटरी के साथ काम करना स्वाभाविक बनाते हैं। मुख्य लाभ:
- निर्भरताओं का सरलीकरण: सभी मॉड्यूल पैकेजों के एक ही संस्करण का उपयोग करते हैं, संस्करणों में कोई विरोध नहीं होता।
- एकीकृत CI/CD: सभी सेवाओं के लिए एक कॉन्फ़िगरेशन फ़ाइल, बनाए रखना आसान।
- रीफैक्टरिंग: लाइब्रेरी में API बदलने से रिपॉजिटरी में सभी उपभोक्ताओं पर तुरंत प्रभाव पड़ता है।
- एकीकृत मानक: लिंटर, फ़ॉर्मेटर और कोड-रिव्यू पूरे कोड पर लागू होते हैं।
मोनोरिपॉजिटरी संरचना: एक सिद्ध योजना
एक ऐसी संरचना पर विचार करें जो मध्यम आकार के Go प्रोजेक्ट्स के लिए बहुत अच्छी तरह से काम करती है। मान लें कि हमारे पास दो सेवाएँ हैं: auth-service और api-gateway, साथ ही सामान्य लाइब्रेरी भी हैं।
my-project/├── apps/ # निष्पादन योग्य एप्लिकेशन│ ├── auth-service/│ │ ├── cmd/│ │ │ └── main.go│ │ ├── internal/│ │ │ ├── handler/│ │ │ ├── service/│ │ │ └── repository/│ │ ├── go.mod│ │ └── go.sum│ └── api-gateway/│ ├── cmd/│ │ └── main.go│ ├── internal/│ │ ├── middleware/│ │ └── routes/│ ├── go.mod│ └── go.sum├── libs/ # सामान्य लाइब्रेरी│ ├── config/│ │ ├── config.go│ │ ├── go.mod│ │ └── go.sum│ ├── logger/│ │ ├── logger.go│ │ ├── go.mod│ │ └── go.sum│ └── db/│ ├── postgres.go│ ├── go.mod│ └── go.sum├── scripts/ # CI/CD और उपयोगिताओं के लिए स्क्रिप्ट│ ├── build.sh│ └── test.sh├── go.work # Workspace Go (वैकल्पिक)├── .golangci.yml # लिंटर कॉन्फ़िगरेशन├── Makefile # सामान्य कमांड└── README.mdसंरचना के प्रमुख तत्व
apps/— सभी निष्पादन योग्य एप्लिकेशन। प्रत्येक एप्लिकेशन का अपना प्रवेश बिंदु (cmd/main.go) और अपना स्वयं काgo.modहोता है।libs/— सामान्य उपयोग की लाइब्रेरी। प्रत्येक लाइब्रेरी एक अलग Go मॉड्यूल है।scripts/— बिल्ड, परीक्षण और तैनाती के लिए सहायक स्क्रिप्ट।go.work— Go Workspace के लिए फ़ाइल, स्थानीय विकास को सरल बनाती है।
स्थानीय विकास के लिए Go Workspace सेट अप करना
Go 1.18+ go.work फ़ाइल के माध्यम से Workspace का समर्थन करता है। यह दूरस्थ रिपॉजिटरी में प्रकाशित किए बिना libs/ से लाइब्रेरी को स्थानीय रूप से संदर्भित करने की अनुमति देता है।
प्रोजेक्ट रूट में go.work बनाएँ:
go 1.22
use ( ./apps/auth-service ./apps/api-gateway ./libs/config ./libs/logger ./libs/db)अब विकास के दौरान आप सीधे लाइब्रेरी आयात कर सकते हैं:
// apps/auth-service/cmd/main.gopackage main
import ( "my-project/libs/config" "my-project/libs/logger")
func main() { cfg := config.Load() log := logger.New(cfg.LogLevel) log.Info("Auth service started")}महत्वपूर्ण नोट: प्रत्येक एप्लिकेशन के go.mod में, लाइब्रेरी पर निर्भरता को replace के माध्यम से स्थानीय पथ पर इंगित करना चाहिए:
// apps/auth-service/go.modmodule github.com/company/my-project/a