2012-11-03 22 views
59

भले ही मेरे पास GOPATH ठीक से सेट हो, फिर भी मुझे अपने स्वयं के पैकेज खोजने के लिए "बिल्ड बिल्ड" या "रन" नहीं मिल सकता है। मैं क्या गलत कर रहा हूं? आपको बहुत - बहुत धन्यवाद!गो बिल्ड: "पैकेज नहीं मिल रहा है" (भले ही GOPATH सेट हो)

$ echo $GOROOT 
/usr/local/go 

$ echo $GOPATH 
/home/mitchell/go 

$ cat ~/main.go 
package main 
import "foobar" 
func main() { } 

$ cat /home/mitchell/go/src/foobar.go 
package foobar 

$ go build main.go 
main.go:3:8: import "foobar": cannot find package 
+0

मुझे मिलने पर एक ही समस्या मिलती है जब मैं https://github.com/adonovan/gopl.io/tree/master/ch1/helloworld कारण होगा कि इसमें helloworld.go नाम की कोई फ़ाइल नहीं है। पैकेज नाम और फ़ाइल नाम मिलान करके काम प्राप्त करें। –

उत्तर

78

यह काम नहीं करता है, क्योंकि आपके foobar.go स्रोत फ़ाइल एक निर्देशिका foobar कहा जाता है में नहीं है। go build और go install निर्देशिका फ़ाइलों से मेल खाने का प्रयास करें, न कि स्रोत फाइलें।

  1. एक वैध निर्देशिका के लिए सेट $GOPATH, उदा export GOPATH="$HOME/go"
  2. foobar.go से $GOPATH/src/foobar/foobar.go पर जाएं और भवन को ठीक काम करना चाहिए।

अतिरिक्त सिफारिश कदम: $GOPATH/src का एक सबफ़ोल्डर, उदा को PATH="$GOPATH/bin:$PATH"

  • ले जाएँ main.go:

    1. करके अपने $PATH को $GOPATH/bin जोड़े $GOPATH/src/test
    2. go install test अब $GOPATH/bin में निष्पादन योग्य बनाना चाहिए जिसे आपके टर्मिनल में test टाइप करके बुलाया जा सकता है।
  • +0

    क्या यह एक बग नहीं है? मेरा 'GOPATH =/usr/local/go-pkgs', इसलिए स्रोत के लिए'/usr/local/go-pkgs/src/ 'में दिखता है, लेकिन 'get get' इसे'/usr/स्थानीय/गो-pkgs/src/gopkg.in/<पैकेज नाम> '। इंस्टॉल करने के बाद मुझे अपने सभी पैकेज मैन्युअल रूप से क्यों ले जाना चाहिए? यह सिर्फ मूर्ख है। – josiah

    +1

    'get get' सामान्य रूप से' $ GOPATH/src/'में पैकेज डालता है, इसलिए यदि आप 'डोमेन डोमेन/पथ/से/पैकेज' प्राप्त करते हैं तो यह' GOPATH/src/domain.com/path// package' करने के लिए। मुझे लगता है कि आप 'gopkg.in' से पैकेज लाने का प्रयास करते हैं? यदि ऐसा है तो पूरी तरह से इरादा व्यवहार है और आपको बस उन्हें अपने पूर्ण नाम से आयात करना चाहिए; जैसे 'आयात करें" gopkg.in/yaml.v1 "' साथ ही [दस्तावेज़ों में वर्णित] (https://gopkg.in/yaml.v1)। – fasmat

    +0

    अहह, मैं देखता हूं। मेरी अज्ञानता को दूर करने के लिए धन्यवाद। – josiah

    6

    संपादित करें: जब से तुम GOPATH मतलब, देख fasmat के answer (upvoted)

    "How do I make go find my package?" में उल्लेख किया है, आप एक निर्देशिका xxx में एक पैकेज xxx डाल करने के लिए की जरूरत है।

    Go language spec देखें:

    package math 
    

    साझा करने में एक ही PackageName प्रपत्र एक पैकेज के कार्यान्वयन फ़ाइलों का एक सेट।
    एक कार्यान्वयन की आवश्यकता हो सकती है कि एक पैकेज के लिए सभी स्रोत फाइलें एक ही निर्देशिका में रहें।

    Code organization का उल्लेख है:

    जब एक प्रोग्राम है जो पैकेज "widget" go आदेश जाओ जड़ अंदर src/pkg/widget के लिए लग रहा है, और उसके बाद-यदि पैकेज स्रोत वहाँ नहीं मिला है आयात करता है निर्माण - प्रत्येक कार्यक्षेत्र के अंदर src/widget के लिए खोज।

    (एक "कार्यस्थान" में एक पथ प्रविष्टि है अपने GOPATH: उस चर के लिए कई रास्तों संदर्भित कर सकते हैं अपने 'src, bin, pkg' होने का)


    (मूल जवाब)

    तुम भी GOPATH को ~/go, GOROOT पर सेट करना चाहिए, जैसा कि "How to Write Go Code" में दिखाया गया है।

    गो पथ का उपयोग आयात विवरणों को हल करने के लिए किया जाता है। इसे गो/बिल्ड पैकेज में कार्यान्वित और दस्तावेज किया जाता है।

    GOPATH पर्यावरण चर कोडों को देखने के लिए स्थानों को सूचीबद्ध करता है।
    यूनिक्स पर, मान एक कोलन से अलग स्ट्रिंग है।
    विंडोज पर, मान अर्धविराम से अलग स्ट्रिंग है।
    योजना 9 पर, मूल्य एक सूची है।

    कि GOROOT से अलग है:

    जाओ द्विआधारी वितरण मान वे /usr/local/go (या c:\Go Windows के तहत) में स्थापित किया जाएगा, लेकिन यह उन्हें एक अलग स्थान में स्थापित करने के लिए संभव है।
    यदि आप ऐसा करते हैं, तो आपको Go टूल का उपयोग करते समय GOROOT पर्यावरण चर सेट करने की आवश्यकता होगी।

    +3

    GOPATH –

    +0

    सेट अप करने के लिए एक [लघु वीडियो परिचय] (https://www.youtube.com/watch?feature=player_embedded&v=XCsL89YtqCs&noredirect=1) भी है, क्षमा करें, मैंने मूल प्रश्न संपादित किया है। हर जगह मैंने कहा गोरोट I * मतलब * गोपाथ। – MitchellSalad

    -2

    आप जोड़ की पूर्ण सूची अपने 'पथ' को जाना करने की कोशिश की है?

    export PATH=$PATH:/directory/to/go/ 
    
    0

    टी एल; डॉ: पालन जाओ सम्मेलनों! (सबक कठिन तरीके से सीखा), पुराने संस्करणों और remove उन्हें जांचें। नवीनतम स्थापित करें।

    मेरे लिए समाधान अलग था। मैंने एक साझा लिनक्स सर्वर पर काम किया और मेरे GOPATH और अन्य पर्यावरण चर कई बार सत्यापित करने के बाद भी यह काम नहीं किया। मुझे 'पैकेज नहीं मिल सका' और 'अपरिचित आयात पथ' सहित कई त्रुटियों का सामना करना पड़ा। (uninstall भाग सहित) के निर्देशों द्वारा this समाधान के साथ पुनर्स्थापित करने का प्रयास करने के बाद भी समस्याएं आईं।

    मुझे कुछ समय लिया वहाँ अभी भी एक पुराने संस्करण है कि इसकी स्थापना रद्द नहीं किया गया है कि एहसास करने (go version उसके बाद फिर से which go चल रहा है ... DAHH) जो मुझे this सवाल का हो गया और अंत में हल किया।

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