6

go build和有什么区别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

但是,当我指定文件名时,它可以工作。前任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
4

1 回答 1

9

我在 google group site for golang 上问了这个问题,这是其中的一个回答。

go build file.go(即使file.go是 in GOPATH)没有在工作区中构建包,因此它遵循不遵循该规则。缺点是您必须命名所有*.go文件,您无法获得go命令的某些自动行为(例如:测试和安装),并且您无法构建包(需要安装),只能构建可执行文件。此外,它不是一帆风顺的。

" go build file.go" 应该只用于简单的一个源文件二进制文件,您不打算从中分发或重用代码。即便如此,遵循 go 工具的约定通常更简单、更快:每个文件夹一个包(反之亦然)没有相对导入(永远)“ go run file.go”遵循相同的逻辑,甚至更不推荐。

这两种模式都适用于非常特定的用途,在常规程序和包中应避免使用。

作者:卡洛斯·卡斯蒂略

所以事实证明,Google Go 强制包的导入路径相对于src环境变量中的目录GOROOTGOPATH.

因此,这是使用go build.

注:GOPATH设置为C:\gopath

main.go从改变

package main

import _ "./local_file"

func main() {
}

对此

package main

import _ "bug/local_file"

func main() {
}
于 2013-10-08T05:55:08.197 回答