`go build`不必要地重建

时间:2015-08-18 00:26:14

标签: go build

对于我所拥有的一个小程序(特别是cgo调用)来说,构建和运行是非常缓慢的。我想去缓存二进制文件,以便它只在源更新时才重建。我会使用一个带有%规则的简单Makefile,但是语言设计者声称go的构建支持并不需要Makefile。

我还有另一种被忽视的选择吗? go社区是否更喜欢另一个构建系统,可能是基于哈希的,用于缓存和重用构建产品?

2 个答案:

答案 0 :(得分:5)

go buildgo install即将推出(2018年第一季度的第1.10段)要快得多:请参阅this threadthis草案文件。

  

go命令现在维护构建包和其他小元数据(CL 68116CL 75473)的缓存。缓存默认为操作系统定义的用户缓存目录,但可以通过设置$GOCACHE来移动   运行" go env GOCACHE"查看当前的有效设置。现在,go命令永远不会从缓存中删除任何内容。如果缓存太大,请运行" go clean -cache"而不是删除目录。该命令将保留缓存的log.txt文件。几个星期后,我会要求人们将他们的log.txt文件发布到Github问题,以便我们可以评估缓存大小管理方法。

     

构建缓存的主要作用是像" go test"和" go build"快速运行并始终执行增量构建,尽可能积极地重用过去的构建步骤   您不必使用" go test -i"或" go build -i"或" go install"只是为了获得快速增量构建。我们不再需要向新用户传授这些变通方法。一切都会很快。

请注意,go install不会安装指定软件包的依赖项:请参阅" What does go build build?"。

答案 1 :(得分:1)

我写了tool,这恰好解决了这个副作用。仅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这样的替代方案。