go build vs go build file.go

Lar*_*tle 4 compiler-construction build go

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
Run Code Online (Sandbox Code Playgroud)

Lar*_*tle 7

我在google网站上为golang提出了这个问题,这是其中一个回复.

go build file.go(即使file.go进入GOPATH)不是在工作空间中构建包,因此遵循该规则.缺点是你必须命名所有*.go文件,你没有得到go命令的一些自动行为(例如:测试和安装),你不能构建一个包(需要安装),只能构建可执行文件.而且,这不是可以得到的.

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

这两种模式都是针对非常特定的用途,应该在常规程序和包中避免使用.

作者:卡洛斯卡斯蒂略

因此,事实证明Google Go强制将包的导入路径相对于src环境变量GOROOT或目录中的目录GOPATH.

因此,这是使程序构建的修复程序go build.

注意:GOPATH设置为C:\gopath

变化main.go

package main

import _ "./local_file"

func main() {
}
Run Code Online (Sandbox Code Playgroud)

对此

package main

import _ "bug/local_file"

func main() {
}
Run Code Online (Sandbox Code Playgroud)