2013-01-21 26 views
2

我試圖編譯由多個模塊的圍棋程序,就像這樣:什麼是圍棋編譯器「沒有這樣的文件或目錄」呢?

// main.go 
package main 
import "mst" 
// do something interesting involving minimum spanning trees 

// src/mst/kruskal.go 
import "disjsets" 
// Kruskal's algorithm follows 

// src/disjsets/disjsets.go 
// implements disjoint sets with union-find 

現在,當我在包含main.gosrc目錄export GOPATH=.後運行要麼go run main.gogo build,它打印

# disjsets 
open src/disjsets/disjsets.go: No such file or directory 

我不明白這一點。該文件在ls -l src/disjsets/disjsets.go確認。這怎麼會發生?如果Go要找到它,disjsets.go文件應該在哪裏存在?

(谷歌轉到1.0.2)

+1

你或許應該改變你的問題的話題,編譯器不「謊言」這樣的回答你的問題是存在的,它的意思是「沒有這樣的文件或目錄」你的問題是不是這個意思的是,這就是爲什麼它是說,(如果文件存在) –

+0

** **在哪裏你在做'出口GOPATH = .'? – zzzz

+0

@jnml:在含有'main.go'和'src'的目錄。 –

回答

6

我相信你應該閱讀,或重讀How to Write Go code

簡而言之:

設置你GOPATH某處並將其導出爲好。然後把一些包blah進入目錄

$GOPATH/src/foo/bar/baz/blah # (1) 

$GOPATH/src/blah # (2) 

$GOPATH/src/qux/blah # (3) etc. 

導入blah到其他包作爲

import "foo/bar/baz/blah" // (1) 

import "blah" // (2) 

import "qux/blah" // (3) 

在該目錄中的包將包含包文件。假設你只有一個,blah.go。然後,它的位置是

$GOPATH/src/foo/bar/baz/blah/blah.go // (1) 

$GOPATH/src/blah/blah.go // (2) 

$GOPATH/src/qux/blah/blah.go // (3) 

如果嗒嗒包源文件被命名爲,說proj.go代替,然後

$GOPATH/src/foo/bar/baz/blah/proj.go // (1) 

$GOPATH/src/blah/proj.go // (2) 

$GOPATH/src/qux/blah/proj.go // (3) 

但進口路徑將是相同的前面的情況。

+0

很好的回答。+1 – weberc2

+0

請考慮一下''export GOPATH = ...'應該出現在'〜/ .bashrc'或'〜/ .profile'或其他一些內容中,所以它不是特定於某個特定的shell。 – weberc2

2

好吧,這似乎解決它:

export GOPATH=`pwd` 

顯然,它需要一個絕對路徑。不過,我仍然發現錯誤信息非常混亂。

+2

我建議添加到你最喜歡的shell配置文件中,例如'export GOPATH = $ HOME',然後在'〜/ src/foo/blah/whatever.go'中寫下你的包'foo/blah'的代碼。將GOPATH切換到'pwd'可能是有道理的,但可能只在非現在的情況下。 IOW,'pwd'黑客是IMO不是一個好主意。可能更多,如果這是某人Go的第一步。 – zzzz

+0

@jnml:我仍在學習語言和工具 - 但是按照語言而不是按項目組織我的代碼並不是我喜歡的工作方式。也許我應該改變習慣,我會看到的。 –

+0

我有'〜/ src'下面所有不同的語言項目。子樹路徑是公共存儲路徑(例如'〜/ src/github.com/nick/prj-in-lang-x')以及我使用的公司資料。 '〜/ src/gitlab.ourdomain.com/proj-in-lang-y',它本質上是相同的模式。通過這種方式,所有的語言在我的磁盤上和平共處;-) – zzzz

相關問題