go mod download必须在缓存restore后、build前执行,以确保依赖已预载入$gopath/pkg/mod;它不被go build顺带触发,需显式运行,且缓存key须含go.sum哈希、路径仅限$home/go/pkg/mod、goproxy须配direct fallback。

go mod download 必须在缓存 restore 之后、build 之前执行
缓存生效的前提是 Go 工具链提前把依赖“拉进”$GOPATH/pkg/mod,而 go build 默认不负责下载——它只报错退出。所以不能靠 go test 或 go build 顺带触发下载。
-
actions/cache@v4restore 后,目录可能为空或过期,必须显式跑一次go mod download - 这步必须放在
go test或go build之前,否则并发测试可能因模块未就位而超时 - 如果项目含私有模块,
go mod download会暴露 GOPROXY 配置问题,比 build 失败更早发现
缓存 key 必须包含 go.sum 哈希,不能只用 Go 版本
仅用 ${{ matrix.go-version }} 作缓存 key 是常见错误:go.mod 小改(比如升级一个 patch 版本)后,旧缓存仍被命中,但 go.sum 已不匹配,导致 checksum mismatch 或构建不一致。
- 正确写法:
key: ${{ runner.os }}-go-mod-${{ hashFiles('**/go.sum') }} - 不要用
**/go.mod—— 它变化太频繁,且不反映实际依赖树变更 - 多模块仓库(如 monorepo)需确保
hashFiles覆盖所有go.sum,例如**/go.sum或指定路径
缓存路径要精确到 $HOME/go/pkg/mod,别缓存整个 $HOME/go
$HOME/go 包含 bin/、src/ 和构建产物,缓存它会导致 job 间污染:上个 job 编译的二进制可能被下个 job 错误复用,尤其当 GOOS/GOARCH 变化时。
- 只缓存
$HOME/go/pkg/mod—— 这是 Go modules 的唯一依赖存储区 - 确认路径:在 Actions 中运行
go env GOPATH,多数情况是/home/runner/go,不是$GOROOT - 别加
~/.cache/go-build到同一 cache action —— 它应单独用另一个actions/cache@v4实例处理
GOPROXY 必须配 direct,否则私有模块 404
只设 GOPROXY=https://goproxy.cn 在 CI 中很危险:遇到 git.internal.company/util 这类私有域名,代理直接返回 404,而不是 fallback 到本地 git fetch。
- 正确配置:
GOPROXY=https://goproxy.cn,direct—— 逗号分隔,direct表示“代理查不到就自己连” - 验证方式:
go env GOPROXY输出必须含direct;再试go list -m private/internal,不报错即生效 - 国内建议换为
https://goproxy.cn,direct,proxy.golang.org常因 DNS 污染超时
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











