"मैंने पैकेज इंस्टॉल किया, लेकिन हटा नहीं पा रहा!" — क्या यह कहानी जानी-पहचानी है?
\n\nआपने अभी-अभी Go सीखना शुरू किया है, GitHub पर एक शानदार लाइब्रेरी मिली, go get github.com/example/package लिखा — और सब कुछ काम कर गया! लेकिन समय बीतता है, प्रोजेक्ट बदलता है, और आपको एहसास होता है: इस पैकेज की अब ज़रूरत नहीं है। आप go remove या go uninstall कमांड ढूंढते हैं, लेकिन... वह मौजूद ही नहीं है।
Go की दुनिया में आपका स्वागत है, जहाँ पैकेज हटाना कोई बटन नहीं, बल्कि एक छोटा सा साहसिक कार्य है। इस लेख में हम समझेंगे कि go get के बाद पैकेज कहाँ जाते हैं, उन्हें सही तरीके से कैसे "बाहर निकाला" जाए, और Go में ऐसा क्यों किया गया है। स्पॉयलर: पढ़ने के बाद आप सिस्टम में कचरे से डरना बंद कर देंगे और अपने प्रोजेक्ट्स को साफ रखना सीख जाएंगे।
go get कैसे काम करता है: एक संक्षिप्त परिचय
\n\nहटाने से पहले, आइए समझें कि पैकेज वास्तव में कहाँ जाता है। Go में (वर्जन 1.16 से पहले, लेकिन यह जानकारी अभी भी प्रासंगिक है) go get कमांड पैकेज के सोर्स कोड को दो डायरेक्ट्रीज़ में डाउनलोड करती थी:
- \n
$GOPATH/src— पैकेज की सोर्स फ़ाइलें (जैसे आपने रिपॉजिटरी क्लोन की हो); \n $GOPATH/pkg— कंपाइल की गई ऑब्जेक्ट फ़ाइलें (.a). \n
अगर आप Go modules का उपयोग कर रहे हैं (और वर्जन 1.16 से यह डिफ़ॉल्ट मोड है), तो go get अलग तरीके से काम करता है: यह go.mod में डिपेंडेंसी जोड़ता है और मॉड्यूल को कैश ($GOPATH/pkg/mod) में डाउनलोड करता है।
समस्या यह है कि Go में "पैकेज हटाएं" जैसी कोई बिल्ट-इन कमांड नहीं है. भाषा के डेवलपर्स मानते हैं कि अगर पैकेज की ज़रूरत नहीं है, तो बस इसे अपने कोड में इम्पोर्ट न करें। यह तार्किक लगता है, लेकिन अगर जगह खाली करनी हो या व्यवस्था बनानी हो तो क्या करें?
\n\nतरीका #1: go clean -i (मॉड्यूल के बिना पुराने प्रोजेक्ट्स के लिए)
\n\nपहले (मॉड्यूल के युग से पहले) go clean -i कमांड मौजूद थी। यह $GOPATH/pkg से पैकेज की कंपाइल की गई फ़ाइलों को हटा देती थी। लेकिन सोर्स फ़ाइलों को यह नहीं छूती थी। यानी आप केवल बाइनरी आर्टिफैक्ट्स हटाते थे, लेकिन कोड src में वैसे ही रहता था।
# पैकेज की कंपाइल की गई फ़ाइलें हटाएं\ngo clean -i github.com/example/package\n\n# सोर्स फ़ाइलें अभी भी यहाँ हैं:\nls $GOPATH/src/github.com/example/package\n\nव्यवहार में यह असुविधाजनक था। इसलिए Go के आधुनिक वर्जन (1.12 से शुरू) में go clean -i को पुराना घोषित कर दिया गया। अगर आप अब go clean -i लिखते हैं, तो Go बस -i फ्लैग को अनदेखा करेगा और सामान्य go clean (मौजूदा प्रोजेक्ट में ऑब्जेक्ट फ़ाइलें हटाना) चलाएगा।
तरीका #2: GOPATH से मैन्युअल हटाना (पुराने उपयोगकर्ताओं के लिए)
\n\nअगर आप अब भी मॉड्यूल के बिना काम कर रहे हैं (या बस पुराने कचरे को साफ करना चाहते हैं), तो आपको हाथ से काम करना होगा। यहाँ पूरी विधि है:
\n\n- \n
- पता करें कि आपका
$GOPATHकहाँ है: \n
go env GOPATH\n\nआमतौर पर यह /home/user/go या C:\\Users\\user\\go होता है।
- \n
- सोर्स फ़ाइलें हटाएं: \n
rm -rf $GOPATH/src/github.com/example/package\n\n- \n
- कंपाइल की गई फ़ाइलें हटाएं (अगर मौजूद हों): \n
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a\n\n\n\n\nमहत्वपूर्ण:
\n.aफ़ाइल का पथ आपके OS और आर्किटेक्चर पर निर्भर करता है।linux_amd64एक सामान्य उदाहरण है। सटीक पथgo list -mसे पता किया जा सकता है, लेकिनpkgमें पैकेज का पूरा फ़ोल्डर हटाना आसान है।
यह तरीका काम करता है, लेकिन यह गंदा है। आप गलती से कुछ ज़रूरी चीज़ हटा सकते हैं। साथ ही, अगर पैकेज का उपयोग अन्य प्रोजेक्ट्स में होता है, तो वे टूट जाएंगे।
\n\nतरीका #3: आधुनिक तरीका — go mod tidy
\n\nअगर आप Go modules का उपयोग कर रहे हैं (और अगर आपने 2024 में सीखना शुरू किया है तो आपको इसका उपयोग करना चाहिए), तो सब कुछ बहुत आसान है। जब आप अपने कोड में किसी पैकेज को इम्पोर्ट करना बंद कर देते हैं, तो वह अपने आप go.mod से हट जाता है।