我总是使用 -i 标志构建来安装软件包,并且 .a 文件安装在 GOPATH/pkg 目录中。GOCACHE 目录由go env GOCACHE似乎也存储缓存文件。它们之间有什么区别?
我想知道的是,如果我想让构建时间更快,它们都应该被保存?
TLDR;缓存文件夹是go工具内部的,它的工作对用户来说应该是不透明的,其目的是加速构建和测试。例如,如果您使用版本控制系统(如git),在分支或版本之间切换,则GOPATH/pkg可能只包含一个版本的包文件。go cache 文件夹可能包含(部分)编译的多个分支和版本的包,当您在分支和版本之间切换时加快未来的构建。
缓存文件夹是在Go 1.10中引入的:
该
go build命令现在维护最近构建的包的缓存,与$GOROOT/pkg或 中已安装的包分开$GOPATH/pkg。缓存的作用应该是加快未显式安装包或在不同源代码副本之间切换时的构建(例如,在版本控制系统中的不同分支之间来回更改时)。添加-i速度标志的旧建议(如go build -i或go test -i)不再需要:构建运行速度与没有-i. 有关更多详细信息,请参阅go help cache。
所以你不需要再使用-i快速构建了。
来自输出的一些引用go help cache:
go 命令缓存构建输出以在未来构建中重用。缓存数据的默认位置是当前操作系统的标准用户缓存目录中名为 go-build 的子目录。设置 GOCACHE 环境变量会覆盖此默认值,并且运行 'go env GOCACHE' 会打印当前缓存目录。
go 命令会定期删除最近未使用的缓存数据。运行“go clean -cache”会删除所有缓存数据。
构建缓存正确地解释了 Go 源文件、编译器、编译器选项等的更改:在典型使用中不需要明确地清理缓存。但是,构建缓存不会检测到使用 cgo 导入的 C 库的更改。如果您对系统上的 C 库进行了更改,则需要明确清除缓存,否则使用 -a 构建标志(请参阅“go help build”)来强制重建依赖于更新的 C 库的包。
go 命令还缓存成功的包测试结果。有关详细信息,请参阅“去帮助测试”。运行 'go clean -testcache' 删除所有缓存的测试结果(但不缓存构建结果)。
缓存文件夹还用于存储测试结果,因此在某些情况下,可能会在不再次运行测试的情况下显示缓存的结果。