我还有另一种被忽视的选择吗? go社区是否更喜欢另一个构建系统,可能是基于哈希的,用于缓存和重用构建产品?
答案 0 :(得分:5)
go build
和go install
即将推出(2018年第一季度的第1.10段)要快得多:请参阅this thread和this草案文件。
go命令现在维护构建包和其他小元数据(CL 68116和CL 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这样的替代方案。