2012-11-03 31 views
59

儘管我已經正確設置了GOPATH,但仍然無法通過「開始構建」或「運行」來查找我自己的軟件包。我究竟做錯了什麼?非常感謝!Go build:「找不到軟件包」(儘管設置了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。 go通過匹配包名和文件名來獲取作品。 –

回答

78

它不工作,因爲你foobar.go源文件是不是在叫foobar目錄。 go buildgo install嘗試匹配目錄,而不是源文件。

  1. $GOPATH設置爲有效的目錄,例如, export GOPATH="$HOME/go"
  2. 移動foobar.go$GOPATH/src/foobar/foobar.go建築應該工作得很好。

其他推薦步驟:

  1. 通過添加$GOPATH/bin$PATHPATH="$GOPATH/bin:$PATH"
  2. 移動main.go$GOPATH/src子文件夾,例如$GOPATH/src/test
  3. go install test現在應該創造$GOPATH/bin一個可執行文件,可以通過鍵入test到您的終端調用。
+0

這不是一個錯誤?我的'GOPATH =/usr/local/go-pkgs',所以Go在'/ usr/local/go-pkgs/src/中查找源代碼,但'go get'將它放在'/ USR /本地/復PKGS/SRC/gopkg.in/<包名稱>'。爲什麼我必須在安裝後手動移動所有軟件包?這太愚蠢了。 – josiah

+1

'go get'通常會將軟件包放入'$ GOPATH/src /'中,所以如果你調用'go get domain.com/path/to/package',它將以'$ GOPATH/src/domain.com/path /到/ package'。我想你試圖從'gopkg.in'獲取一個包?如果是這樣的絕對意圖的行爲,你應該只將它們的全名導入;例如'也可以[在文檔](https://gopkg.in/yaml.v1)中描述的「import」gopkg.in/yaml.v1「'。 – fasmat

+0

啊,我明白了。感謝消除我的無知。 – josiah

6

編輯:既然你的意思GOPATH,看到fasmatanswer(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」中所示。

Go路徑用於解析導入語句。它由go/build軟件包實施並記錄在案。

GOPATH環境變量列出了要查找Go代碼的位置。
在Unix上,該值是冒號分隔的字符串。
在Windows上,該值是以分號分隔的字符串。
在計劃9上,該值是一個列表。

也就是說從GOROOT不同:

轉到二進制分發假設它們將被安裝在(Windows下或c:\Go/usr/local/go,但也可以在不同的位置進行安裝。
如果您這樣做,則在使用Go工具時,需要將GOROOT環境變量設置爲該目錄。

+3

還有一個[簡短視頻介紹](https://www.youtube.com/watch?feature=player_embedded&v=XCsL89YtqCs&noredirect=1)設置GOPATH –

+0

對不起,我編輯了原始問題。我到處說過GOROOT我*表示* GOPATH。 – MitchellSalad

-2

您是否嘗試過將絕對目錄添加到您的'路徑'?

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

TL; DR:遵循Go慣例! (經驗教訓困難),檢查舊版本和remove他們。安裝最新。

對我來說,解決方案是不同的。我曾在一臺共享的Linux服務器上工作,在幾次驗證我的GOPATH和其他環境變量後,它仍然無法工作。我遇到了一些錯誤,包括'找不到軟件包'和'無法識別的導入路徑'。在嘗試重新安裝this解決方案後,通過golang.org(包括uninstall部分)的說明仍遇到問題。

我花了一些時間來認識到,仍有尚未卸載舊版本(運行go version然後which go再次... DAHH),這讓我對this問題終於解決了。

相關問題