在我拥有的一个小程序(尤其是cgo调用)上,go build和go run非常慢。我想缓存二进制文件,以便仅在源文件较新时才重建。我会使用带有%规则的简单Makefile,但是语言设计人员声称go的构建支持不需要Makefile。
我还有其他选择吗?go社区是否愿意使用另一个构建系统(可能是基于哈希的构建系统)来缓存和重用构建产品?
我写了一个工具来解决这个问题。go build单独不会检查其生成的可执行文件是否已经更新。go install这样做,并且如果您对其进行了调整以将其安装到您选择的位置,那么您将获得所需的结果,类似于go build。
go build
go install
您可以通过执行以下操作来查看描述的行为:
$ go get -d github.com/anacrolix/missinggo/cmd/nop $ time go run "$GOPATH"/src/github.com/anacrolix/missinggo/cmd/nop/*.go real 0m0.176s user 0m0.142s sys 0m0.048s
那是一个温暖的运行。go run会像每次调用一样在每次调用时链接go build。请注意,github.com/anacrolix/missinggo/cmd/nop该程序绝对不执行任何操作。
go run
github.com/anacrolix/missinggo/cmd/nop
这里使用我的工具godo调用相同的软件包:
$ time godo github.com/anacrolix/missinggo/cmd/nop real 0m0.073s user 0m0.029s sys 0m0.033s
对于较大的程序,差异应该更明显。
因此,总而言之,您的标准工具选项是使用go install或类似godo的替代方法。