2013-10-07 151 views
3

go buildgo build file.go有什麼區別?go build vs go build file.go

我在問,因爲當我在導入本地包的包上運行go build時,出現此錯誤消息。

can't load package: C:\go\src\bug\main.go:3:8: local import "./local_file" in non-local package

然而,當我指定它工作的文件名。 Ex go build main.go

Windows XP上的控制檯歷史記錄。

C:\gopath\src\bug:>go version 
go version go1.1 windows/386 
C:\gopath\src\bug:>dir 
... 
<DIR>   local_file 
       55 main.go 
... 

C:\gopath\src\bug:>type main.go 
package main 

import _ "./local_file" 

func main() { 
} 

C:\gopath\src\bug:>type local_file\local_file.go 
package local_file 

import "fmt" 

func init() { 
     fmt.Println("Called: local_file.init()") 
} 

C:\gopath\src\bug:>go run main.go 
Called: local_file.init() 

C:\gopath\src\bug:>go build main.go 

C:\gopath\src\bug:>dir 
... 
<DIR>   local_file 
     1,285,120 main.exe 
       55 main.go 
... 

C:\gopath\src\bug:>go build 
can't load package: C:\gopath\src\bug\main.go:3:8: local import "./local_file" in non-local package 
+0

應該在哪裏'去build'安裝包LOCAL_FILE什麼? – Volker

+0

任何地方,但爲什麼需要安裝軟件包'local_file'來創建可執行文件?編譯器不應該在本地引用它嗎? –

回答

5

我在golang的google小組網站上問過這個問題,這裏有一個回覆。

go build file.go(即使file.goGOPATH)未建立 包在一個工作空間,因此它遵循不遵循這一規則。該 缺點是,你必須命名所有的*.go文件,你沒有得到 一些go命令的自動行爲(例如:測試& 安裝),並且你不能建立一個包(這需要 安裝),只有可執行文件。另外,這不是可以得到的。

的「go build file.go」應該永遠只能用於你不打算永遠從分發或重複使用代碼 簡單的一個源文件 二進制文件。即使如此,遵循轉換工具的約定通常更簡單且更快:每個文件夾一個包裝(反之亦然)無相關 進口(有史以來)「go run file.go」遵循相同的邏輯,並且甚至 推薦較少。

這兩種模式都是用於非常特定的用途,應該避免在常規程序和軟件包中使用 。

通過:Carlos Castillo

所以事實證明,谷歌去強制執行的包是相對於在環境變量GOROOTGOPATHsrc目錄導入路徑。

因此,這裏是修復程序,使程序與go build構建。

注:GOPATH

package main 

import _ "./local_file" 

func main() { 
} 

設置爲C:\gopath

變化main.go對此

package main 

import _ "bug/local_file" 

func main() { 
}