一尘不染

`go build`不必要地重建

go

在我拥有的一个小程序(尤其是cgo调用)上,go build和go
run非常慢。我想缓存二进制文件,以便仅在源文件较新时才重建。我会使用带有%规则的简单Makefile,但是语言设计人员声称go的构建支持不需要Makefile。

我还有其他选择吗?go社区是否愿意使用另一个构建系统(可能是基于哈希的构建系统)来缓存和重用构建产品?


阅读 326

收藏
2020-07-02

共1个答案

一尘不染

我写了一个工具来解决这个问题。go build单独不会检查其生成的可执行文件是否已经更新。go install这样做,并且如果您对其进行了调整以将其安装到您选择的位置,那么您将获得所需的结果,类似于go build

您可以通过执行以下操作来查看描述的行为:

$ 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该程序绝对不执行任何操作。

这里使用我的工具godo调用相同的软件包:

$ time godo github.com/anacrolix/missinggo/cmd/nop

real    0m0.073s
user    0m0.029s
sys     0m0.033s

对于较大的程序,差异应该更明显。

因此,总而言之,您的标准工具选项是使用go install或类似godo的替代方法。

2020-07-02