"go get" क्यों काम नहीं कर रहा और इसे कैसे ठीक करें?
\nअगर आपने कभी सोचा है "How can I install a package with go get?" — तो आप अकेले नहीं हैं। इस सवाल को Stack Overflow पर हज़ारों बार देखा गया है, और यह सही भी है। पहले सब कुछ आसान था: go get github.com/some/package — और लाइब्रेरी सीधे $GOPATH/src में आ जाती थी। लेकिन Go 1.16 आने के बाद सब कुछ बदल गया। अब go get पुराने तरीके से पैकेज इंस्टॉल नहीं करता। इसके बजाय, यह सिर्फ go.mod फ़ाइल को अपडेट करता है। और बाइनरी फ़ाइलें इंस्टॉल करने के लिए go install कमांड आ गई है।
इस लेख में हम समझेंगे कि क्या हुआ, अब सही तरीके से पैकेज और डिपेंडेंसी कैसे इंस्टॉल करें, और शुरुआती लोग अक्सर कहाँ गलती करते हैं। चलिए शुरू करते हैं!
\n\nसंक्षिप्त इतिहास: GOPATH से मॉड्यूल तक
\nGo 1.11 से पहले, सारा कोड GOPATH नामक एक विशेष फ़ोल्डर में रहता था, जहाँ आपके सभी प्रोजेक्ट और तीसरे पक्ष के पैकेज रखे जाते थे। go get कमांड सीधे वहाँ सोर्स कोड डाउनलोड करती थी। यह सुविधाजनक था, लेकिन वर्जन कंट्रोल में समस्या पैदा करता था: अगर दो प्रोजेक्ट्स को एक ही लाइब्रेरी के अलग-अलग वर्जन चाहिए होते — तो मुश्किल हो जाती थी।
Go modules (Go 1.11 से शुरू और 1.16 में स्थिर) आने के बाद, हर प्रोजेक्ट को अपनी go.mod फ़ाइल मिली, जिसमें डिपेंडेंसी और उनके वर्जन लिखे होते हैं। अब go get अलग तरह से काम करता है:
- \n
- जोड़ता है डिपेंडेंसी को
go.modमें \n - डाउनलोड करता है उसे कैश में (आमतौर पर
$GOPATH/pkg/mod) \n - नहीं बनाता
$GOPATH/binमें बाइनरी फ़ाइल \n
अगर आपको कोई तैयार प्रोग्राम इंस्टॉल करना है (जैसे कमांड लाइन टूल) — तो go install का उपयोग करें।
अब go get कैसे काम करता है: चरण-दर-चरण समझ
\nटर्मिनल खोलें और एक नया मॉड्यूल बनाएँ:
\nmkdir myproject\ncd myproject\ngo mod init myproject\nअब मान लीजिए, हम रूटिंग के लिए लोकप्रिय लाइब्रेरी gorilla/mux जोड़ना चाहते हैं। पहले हम लिखते थे:
go get github.com/gorilla/mux\nऔर यह काम करेगा — लाइब्रेरी डाउनलोड हो जाएगी। लेकिन देखिए क्या होता है:
\n- \n
go.modमें एक लाइन जुड़ जाती है:require github.com/gorilla/mux v1.8.0\n - प्रोजेक्ट फ़ोल्डर में
go.sumफ़ाइल बनती है — सुरक्षा के लिए चेकसम वाली फ़ाइल \n - लाइब्रेरी का सोर्स कोड कैश में रहता है, प्रोजेक्ट के साथ नहीं \n
अब आप अपने कोड में पैकेज इम्पोर्ट कर सकते हैं:
\npackage main\n\nimport (\n "fmt"\n "github.com/gorilla/mux"\n)\n\nfunc main() {\n r := mux.NewRouter()\n fmt.Println("Router created!")\n}\ngo run main.go चलाएँ — सब काम करेगा। लेकिन अगर आप बाइनरी फ़ाइल (कंपाइल प्रोग्राम) चाहते हैं — तो go get आपको वह नहीं देगा।
बाइनरी इंस्टॉल करना: go install मदद के लिए आता है
\nमान लीजिए, आपको Go में एक बढ़िया टूल मिला, जैसे golangci-lint — कोड लिंटर। इसे सिस्टम में कमांड के रूप में इंस्टॉल करने के लिए पहले लिखते थे:
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nअब यह काम नहीं करेगा (चेतावनी देगा)। सही तरीका है:
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\nइससे क्या होगा:
\n- \n
- Go टूल का सोर्स कोड डाउनलोड करेगा \n
- उसे कंपाइल करेगा \n
- तैयार बाइनरी फ़ाइल को
$GOPATH/bin(या$GOBIN, अगर सेट है) में रखेगा \n
सुनिश्चित करें कि $GOPATH/bin आपके PATH में जुड़ा है — नहीं तो कमांड उपलब्ध नहीं होगी। इसे जाँचने का तरीका:
echo $GOPATH\n# आमतौर पर /home/user/go\nls ~/go/bin/\nअगर वहाँ आपकी बाइनरी फ़ाइल है — तो सब ठीक है।
\n\nशुरुआती लोगों की आम गलतियाँ (और उनसे कैसे बचें)
\nStack Overflow पर सबसे ज़्यादा ये सवाल पूछे जाते हैं:
\n- \n
- "go get src फ़ोल्डर नहीं बनाता"
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें