यद्यपि स्वीकृत उत्तर पैकेज नामों के साथ निर्देशिकाओं के मिलान की आवश्यकता के बारे में अभी भी सही है, आपको वास्तव में GOPATH का उपयोग करने के बजाय गो मॉड्यूल का उपयोग करने के लिए माइग्रेट करने की आवश्यकता है। इस समस्या का सामना करने वाले नए उपयोगकर्ता GOPATH (जैसा मैं था) के उपयोग के उल्लेखों के बारे में भ्रमित हो सकते हैं, जो अब पुराने हो चुके हैं। इसलिए, मैं इस मुद्दे को साफ करने की कोशिश करूंगा और गो मॉड्यूल का उपयोग करते समय इस मुद्दे को रोकने से जुड़े मार्गदर्शन प्रदान करूंगा।
यदि आप पहले से ही गो मॉड्यूल से परिचित हैं और इस समस्या का सामना कर रहे हैं, तो नीचे मेरे और विशिष्ट अनुभागों को छोड़ दें जिनमें कुछ गो सम्मेलनों को कवर किया गया है जो अनदेखी या भूलना आसान है।
यह मार्गदर्शिका गो मॉड्यूल के बारे में सिखाती है: https://golang.org/doc/code.html
गो मॉड्यूल के साथ परियोजना संगठन
एक बार जब आप गो मॉड्यूल पर माइग्रेट हो जाते हैं, जैसा कि उस लेख में बताया गया है, वर्णित प्रोजेक्ट कोड को व्यवस्थित करें:
एक रिपॉजिटरी में एक या एक से अधिक मॉड्यूल होते हैं। एक मॉड्यूल संबंधित गो संकुल का एक संग्रह है जो एक साथ जारी किया जाता है। गो रिपॉजिटरी में आम तौर पर केवल एक मॉड्यूल होता है, जो रिपॉजिटरी के मूल में स्थित होता है। Go.mod नाम की एक फ़ाइल मॉड्यूल पथ की घोषणा करती है: मॉड्यूल के भीतर सभी पैकेजों के लिए आयात पथ उपसर्ग। मॉड्यूल में अपनी go.mod फ़ाइल के साथ-साथ उस निर्देशिका की उपनिर्देशिका वाली निर्देशिका में पैकेज होते हैं, अगली उपनिर्देशिका तक अन्य go.mod फ़ाइल (यदि हो तो) होती है।
प्रत्येक मॉड्यूल का पथ न केवल अपने पैकेज के लिए एक आयात पथ उपसर्ग के रूप में कार्य करता है, बल्कि यह भी इंगित करता है कि गो कमांड को इसे डाउनलोड करने के लिए कहां देखना चाहिए। उदाहरण के लिए, मॉड्यूल golang.org/x/tools को डाउनलोड करने के लिए, गो कमांड https://golang.org/x/tools (यहां वर्णित अधिक) द्वारा इंगित भंडार से परामर्श करेगा ।
एक आयात पथ एक स्ट्रिंग है जिसका उपयोग पैकेज आयात करने के लिए किया जाता है। पैकेज का आयात पथ इसका मॉड्यूल पथ है जो मॉड्यूल के भीतर अपनी उपनिर्देशिका के साथ जुड़ता है। उदाहरण के लिए, मॉड्यूल github.com/google/go-cmp में निर्देशिका cmp / में एक पैकेज होता है। उस पैकेज का आयात पथ github.com/google/go-cmp/cmp है। मानक लाइब्रेरी के पैकेज में मॉड्यूल पथ उपसर्ग नहीं होता है।
आप इस तरह से अपने मॉड्यूल को इनिशियलाइज़ कर सकते हैं:
$ go mod init github.com/mitchell/foo-app
इसे बनाने के लिए आपके कोड को github.com पर स्थित होने की आवश्यकता नहीं है। हालाँकि, अपने मॉड्यूल्स की संरचना करना सबसे अच्छा अभ्यास है क्योंकि वे अंततः प्रकाशित हो जाएंगे।
एक पैकेज पाने की कोशिश करते समय क्या होता है, यह समझना
यहां एक शानदार लेख है जो पैकेज या मॉड्यूल प्राप्त करने की कोशिश करने पर क्या होता है, इसके बारे में बात करता है: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16
यह चर्चा करता है कि पैकेज कहाँ संग्रहीत है और क्या होगा यदि आप पहले से ही गो मॉड्यूल का उपयोग कर रहे हैं, तो आपको यह समझने में मदद मिलेगी कि आपको यह त्रुटि क्यों हो रही है।
सुनिश्चित करें कि आयातित समारोह का निर्यात किया गया है
ध्यान दें कि यदि आपको किसी अन्य फ़ाइल से फ़ंक्शन को एक्सेस करने में समस्या हो रही है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आपने अपना फ़ंक्शन निर्यात किया है। जैसा कि मैंने पहले दिए गए लिंक में वर्णित किया है, एक फ़ंक्शन को निर्यात करने के लिए एक ऊपरी-केस पत्र के साथ शुरू होना चाहिए और अन्य पैकेजों में आयात करने के लिए उपलब्ध कराया जाना चाहिए।
निर्देशिकाओं के नाम
एक और महत्वपूर्ण विवरण (जैसा कि स्वीकृत उत्तर में बताया गया है) यह है कि निर्देशिकाओं के नाम आपके पैकेजों के नामों को परिभाषित करते हैं। (आपका पैकेज के नाम अपनी निर्देशिका नाम से मेल करने की जरूरत है।) आप यहाँ इस बात का उदाहरण देख सकते हैं: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc
के साथ उस ने कहा, आपकी main
विधि (यानी, आपके आवेदन का प्रवेश बिंदु) वाली फाइल इस आवश्यकता से मुक्त है।
एक उदाहरण के रूप में, मुझे इस तरह की संरचना का उपयोग करते समय अपने आयातों के साथ समस्या थी:
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
मैं utils
अपने main
पैकेज में कोड आयात करने में असमर्थ था ।
हालाँकि, एक बार जब मैंने main.go
इसकी अपनी उपनिर्देशिका में डाल दिया , जैसा कि नीचे दिखाया गया है, मेरे आयात ने ठीक काम किया:
/my-app
├── go.mod
├── /src
├── /app
| └── main.go
└── /utils
└── utils.go
उस उदाहरण में, मेरी go.mod फ़ाइल इस तरह दिखती है:
module git.mydomain.com/path/to/repo/my-app
go 1.14
जब मैंने एक संदर्भ जोड़ने के बाद main.go को सहेजा utils.MyFunction()
, तो मेरी IDE स्वचालित रूप से इस तरह मेरे पैकेज के संदर्भ में खींची गई:
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
(मैं गोल कोड के साथ वीएस कोड का उपयोग कर रहा हूं।)
ध्यान दें कि आयात पथ में पैकेज में उपनिर्देशिका शामिल थी।
एक निजी रेपो से निपटना
यदि कोड एक निजी रेपो का हिस्सा है, तो आपको एक्सेस को सक्षम करने के लिए एक git कमांड चलाना होगा। अन्यथा, आप अन्य त्रुटियों का सामना कर सकते हैं। इस लेख में उल्लेख किया गया है कि निजी गितुब, बिटबकेट, और गिटलैब रिपोज के लिए कैसे करें: https://medium.com/cloud-native-the-gathering/go-modules-ith-pStreet-git-git रिपॉजिटरी-डीएफ़ 68 ९ ५०६b डीबी ४
इस मुद्दे पर भी यहां चर्चा की गई है: निजी रिपॉजिटरी "गो टू गो" का उचित तरीका क्या है?