Go के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन
\n\nमोनोरिपॉजिटरी (monorepo) स्रोत कोड प्रबंधन का एक दृष्टिकोण है, जिसमें सभी प्रोजेक्ट, लाइब्रेरी और सेवाएँ एक ही रिपॉजिटरी में संग्रहीत की जाती हैं। Go की दुनिया में, मॉड्यूल के अंतर्निहित समर्थन और पैकेजों की लचीली प्रणाली के कारण यह दृष्टिकोण विशेष रूप से लोकप्रिय हो गया है। इस लेख में, हम यह समझेंगे कि Go में व्यवहार में मोनोरिपॉजिटरी कैसे व्यवस्थित करें, एक विशिष्ट संरचना, कोड उदाहरण और सर्वोत्तम अभ्यासों पर विचार करेंगे।
\n\nGo में मोनोरिपॉजिटरी की आवश्यकता क्यों है?
\n\nमोनोरिपॉजिटरी कई प्रमुख समस्याओं का समाधान करता है:
\n- \n
- निर्भरता प्रबंधन को सरल बनाना — सभी आंतरिक पैकेज एक ही स्थान पर होते हैं, उन्हें अपडेट और रिफैक्टर करना आसान होता है। \n
- एकीकृत परिवर्तन इतिहास — परमाणु कमिट जो एक साथ कई सेवाओं को प्रभावित करते हैं, बिना अतिरिक्त सिंक्रनाइज़ेशन के काम करते हैं। \n
- CI/CD में तेजी — पाइपलाइनों को कॉन्फ़िगर किया जा सकता है जो प्रोजेक्ट के केवल बदले हुए भागों को बनाती हैं। \n
- कोड गुणवत्ता में सुधार — एकीकृत मानकों, लिंटर्स और कोड-रिव्यू को लागू करना आसान है। \n
Go मोनोरिपॉजिटरी की संरचना: मूल योजना
\n\nGo पर एक विशिष्ट मोनोरिपॉजिटरी संरचना पर विचार करें। उदाहरण के लिए, दो माइक्रोसर्विसेज (api और worker) और एक सामान्य लाइब्रेरी lib वाला प्रोजेक्ट लेते हैं:
my-monorepo/\n├── go.work\n├── go.work.sum\n├── apps/\n│ ├── api/\n│ │ ├── go.mod\n│ │ ├── main.go\n│ │ └── handler.go\n│ └── worker/\n│ ├── go.mod\n│ ├── main.go\n│ └── process.go\n├── lib/\n│ ├── go.mod\n│ ├── auth/\n│ │ └── auth.go\n│ └── db/\n│ └── db.go\n├── scripts/\n│ ├── build.sh\n│ └── test.sh\n└── Makefile\n\nमुख्य तत्व:
\n- \n
go.work— Go Workspace फ़ाइल, जो सभी मॉड्यूल को जोड़ती है। \n apps/— एप्लिकेशन (माइक्रोसर्विसेज, CLI उपयोगिताएँ आदि) वाली निर्देशिका। \n lib/— सामान्य लाइब्रेरीज़ जो सभी एप्लिकेशन द्वारा उपयोग की जाती हैं। \n scripts/— बिल्ड, टेस्ट और डिप्लॉय के लिए सहायक स्क्रिप्ट। \n
Go Workspace (go.work) सेटअप करना
\n\nGo 1.18+ workspace तंत्र प्रदान करता है, जो एक साथ कई मॉड्यूल के साथ काम करने की अनुमति देता है। रूट में go.work फ़ाइल बनाएँ:
go 1.22\n\nuse (\n ./apps/api\n ./apps/worker\n ./lib\n)\n\nअब डेवलपमेंट के दौरान, आप प्रोजेक्ट के रूट से कमांड चला सकते हैं, और Go सभी मॉड्यूल को एक इकाई के रूप में देखेगा। उदाहरण के लिए, सभी मॉड्यूल के लिए टेस्ट चलाने के लिए:
\n\ngo test ./...\n\nऔर किसी विशिष्ट सेवा को बनाने के लिए:
\n\ncd apps/api && go build -o bin/api .\n\nकोड उदाहरण: सामान्य लाइब्रेरी और माइक्रोसर्विस
\n\nlib/auth/auth.go में प्रमाणीकरण के लिए एक सरल लाइब्रेरी बनाएँ:
package auth\n\nimport "errors"\n\nvar (\n ErrInvalidToken = errors.New("invalid token")\n)\n\n// ValidateToken टोकन की जाँच करता है और उपयोगकर्ता ID लौटाता है।\nfunc ValidateToken(token string) (string, error) {\n if token == "" {\n return "", ErrInvalidToken\n }\n // यहाँ वास्तविक JWT जाँच या बाहरी सेवा कॉल हो सकती है\n return "user-123", nil\n}\n\nअब इस लाइब्रेरी का उपयोग माइक्रोसर्विस apps/api/handler.go में करें:
package main\n\nimport (\n "encoding/json"\n "net/http"\n "my-monorepo/lib/auth"\n)\n\ntype UserResponse struct {\n UserID string `json:"user_id"`\n}\n\nfunc UserHandler(w http.ResponseWriter, r *http.Request) {\n token := r.Header.Get("Authorization")\n userID, err := auth.ValidateToken(token)\n if err != nil {\n http.Error(w, "Unauthorized", http.StatusUnauthorized)\n return\n }\n\n resp := UserResponse{UserID: user