2012-05-21 19 views
32

किसी मूल निर्देशिका से कोई सापेक्ष आयात कैसे करता है?मूल निर्देशिका से संबंधित आयात

meme/cmd/meme से:

import "../../../meme" 

यह एक अस्पष्ट त्रुटि देता है:

[email protected]:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ go get bitbucket.org/anacrolix/meme/cmd/meme 

can't load package: /home/matt/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme/main.go:8:2: local import "../../../meme" in non-local package 

[email protected]:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ echo $GOPATH 

/home/matt/gopath 

मैं कैसे एक माता पिता निर्देशिका से स्थानीय स्तर पर आयात करूँ?

+0

मैंने इसे दो अलग-अलग तरीकों से आजमाया और मुझे आपके द्वारा उल्लेख की गई अस्पष्ट त्रुटि दिखाई नहीं दे रही थी। क्या आपका मतलब है कि आपको शब्द संदिग्ध पाया गया है या संदेश पाठ में संदिग्ध शब्द शामिल है। मैंने कोशिश की दो तरीकों को गोपाट के भीतर मेमे/सेमीडी/मेमे, और फिर गोपाथ के बाहर थे। दोनों मामलों में एक सापेक्ष आयात पथ मेरे लिए ठीक काम करता है। क्या आप इस बारे में अधिक जानकारी दे सकते हैं कि आपके लिए क्या काम नहीं कर रहा है? – Sonia

+0

@Sonia क्या आपने गो टूल के साथ प्रयास किया था? मैं और अधिक जानकारी जोड़ूंगा। –

+0

हां। मुझे लगता है कि आपके पास मेमे में एक पैकेज था और मेमे/सेमीडी/मेमे में निष्पादन योग्य था। GOPATH मामले के लिए, निष्पादन योग्य पर चलाएं या इंस्टॉल करें बस काम किया। आउट-ऑफ-जीओपीएटीएच मामले के लिए मैंने मेमो पैकेज को टूल 6 जी के साथ संकलित किया और टूल पैक पर जाया। मुख्य पैकेज में आयात को .a को इंगित करने के लिए बस ../../meme होना आवश्यक था, लेकिन अन्यथा टूल 6 जी पर जाएं और टूल 6l पर जाएं जो एक निष्पादन निष्पादन योग्य है जो पैकेज तक पहुंचा। – Sonia

उत्तर

16

आपके प्रश्न में जोड़ने के लिए धन्यवाद। सबसे पहले, एक जवाब, फिर कुछ स्पष्टीकरण। मैंने आपका कोड

  1. प्राप्त करें, जैसा कि आपने किया था। (मैंने त्रुटि संदेशों को नजरअंदाज कर दिया।)
  2. main.go में आयात लाइन को "../../../meme" पर वापस सेट करना, जैसा कि आप करना चाहते थे।
  3. (एक अप्रयुक्त चर युक्त कोड का एक छोटा सा बाहर टिप्पणी।)
  4. तो मेम/सीएमडी/मेम निर्देशिका में, या तो go run main.go या go build main.go काम किया।

मैं अपनी टिप्पणी में गलत था जब मैंने कहा कि काम स्थापित करें; मुझे कहा जाना चाहिए जाना चाहिए।

हालांकि कुंजी यह है कि go build अकेले काम नहीं करता है; आपको go build main.go टाइप करना होगा। ऐसा इसलिए है क्योंकि जाने का आदेश "गैर-स्थानीय पैकेजों में स्थानीय आयात" की अनुमति नहीं देता है। आप सही हैं कि कल्पना यहां थोड़ी मदद की है। यह कहने से बाहर निकलता है, "आयातपाथ की व्याख्या कार्यान्वयन-निर्भर है।" वर्तमान कार्यान्वयन व्यवहार CL 5787055 के साथ सेट किया गया था, जो बाद में debated at length गो-नट्स पर था।

"स्थानीय" का मतलब फाइल सिस्टम सापेक्ष पथ के साथ इंगित किया गया है। स्पष्ट रूप से एक सापेक्ष पथ से शुरू होता है .. स्थानीय है, इसलिए चाल को स्थानीय पैकेज के रूप में मुख्य रूप से इलाज के लिए go कमांड मिल रहा है। यह स्पष्ट रूप से ऐसा नहीं करता है जब आप go build टाइप करते हैं, लेकिन जब आप go build main.go टाइप करते हैं।

2

मैन्युअल रूप से कंपाइलर, लिंकर, ... का उपयोग करते समय रिलेरिव आयात समर्थित हैं। 'Go' (build) टूल उसी का समर्थन नहीं करता है (किसी भी तरह जावा के समान तुलनीय)।

+1

जबकि संभव हो। कृपया उल्लेख करें कि यह एक निराश गतिविधि है। – mvrak

41

संपादित करें: संबंधित आयात पथ गो में जाने का तरीका नहीं हैं। दस्तावेज़ीकरण की कमी सापेक्ष पथ की लोकप्रियता के बारे में कुछ दिखाती है, और मुझे उनका उपयोग करने का कोई कारण नहीं दिखता है। जाओ अनुशंसित कोड संगठन बहुत अच्छी तरह से काम करता है। प्रत्येक पैकेज में एक अद्वितीय आयात पथ होना चाहिए और उसी आयात पथ का उपयोग करके हर जगह आयात किया जाना चाहिए।

देखें कि github.com/ha/doozerd/peerimports its neighbors जैसे पैकेज कैसे देखें। गो परियोजनाओं के बीच यह एक आम प्रथा है और मैंने इसे कई बार देखा है। पैकेज camlistore.org/pkg/auth (GitHub पर भी; गो के मुख्य लेखकों में से एक द्वारा लिखित) पूर्ण पथ से camlistore.org/pkg/netutil आयात करता है।

भले ही आपके पास एक ही प्रोजेक्ट में दोनों आदेश और पुस्तकालय हैं, यह दृष्टिकोण काम करता है। आपके मूल प्रश्नों में आपने बुद्धिमानी से सर्वोत्तम प्रथाओं के लिए कहा है। मैंने इस मामले पर सर्वोत्तम प्रथाओं को समझाने में अपनी पूरी कोशिश की।


आयात पथ गो में सापेक्ष नहीं हो सकते हैं। मैं How to Write Go Code पढ़ने की अनुशंसा करता हूं, गो परियोजनाओं को व्यवस्थित करने पर आवश्यक पढ़ने। यहां एक संक्षिप्त अवलोकन है:

अपने गो विकास के लिए ~/go जैसी निर्देशिका बनाएं। फिर कहते हैं:

$ export GOPATH=~/go 
$ mkdir $GOPATH/{src,bin,pkg} 

$GOPATH/src अपने सभी जाओ संकुल के लिए स्रोत कोड, यहां तक ​​कि लोगों को अपने डाउनलोड go get साथ रखती है। bin और pkg संकलन के आउटपुट रखें। पैकेज नाम के साथ पैकेज main निष्पादन योग्य बाइनरी के लिए आदेश और उपज हैं जो $GOPATH/bin पर जाते हैं। अन्य पैकेज पुस्तकालय हैं और उनकी संकलित ऑब्जेक्ट फाइलें $GOPATH/pkg में रखी गई हैं।

अब यदि आप अपना कोड $GOPATH/src/matt/meme में डालते हैं, तो आप इसे import "matt/meme" द्वारा आयात कर सकते हैं। आपके पैकेज नामों के लिए उपसर्ग का उपयोग करने और मानक पुस्तकालयों के लिए छोटे पैकेज नाम छोड़ने की अनुशंसा की जाती है। यही कारण है कि मैंने $GOPATH/src/meme के बजाय $GOPATH/src/matt/meme का उपयोग किया।

इस विचार के आसपास अपना कोड व्यवस्थित करें।

+1

मुझे विश्वास है कि वे मोस्तफा कर सकते हैं, लेकिन यह अनियंत्रित है। –

+0

@MattJoiner आप सही हैं। मुझे नहीं पता था कि वे गो टूल के साथ संभव हैं। लेकिन वैसे भी मुझे नहीं लगता कि हमें उनका उपयोग करना चाहिए। मेरा जवाब अपडेट करना है। – Mostafa

+11

सापेक्ष पथ एक (आईएमओ महत्वपूर्ण) उपयोग के मामले के लिए अच्छे हैं: फोर्कड रिपोजिटरी से निपटना। यदि आप जिथब पर किसी के रेपो को फोर्क करते हैं तो आपको अपनी प्रतिलिपि के संदर्भ में सभी आयात विवरणों को अपडेट करना होगा, और फिर उन अपस्ट्रीम को धक्का न दें (या उम्मीद है कि अपस्ट्रीम उन्हें मर्ज में बाहर कर देगा)। बस मैला हो जाता है। –

संबंधित मुद्दे