应设置 GOPRIVATE 环境变量以精准跳过私有域名模块的校验,避免因 sum.golang.org 无法解析私有域名导致 checksum mismatch 或 no such host 错误;GOPRIVATE 支持通配符和多域名逗号分隔,且需同步至所有构建环境。

为什么要排除特定域名的校验
当项目依赖私有 Git 仓库(如 gitlab.example.com/internal/pkg)时,go build 默认会尝试连接 sum.golang.org 校验 checksum,但私有域名无法被公共校验服务解析,直接报错:verifying gitlab.example.com/internal/pkg@v0.1.0: checksum mismatch 或 no such host。这不是模块本身有问题,而是校验机制与网络环境不匹配。
正确设置 GOPRIVATE 环境变量
GOPRIVATE 是 Go 官方支持的、唯一推荐的绕过校验的方式——它告诉 Go:“这些域名下的模块,跳过 GOSUMDB 校验,也不走代理”。必须用完整域名,支持通配符。
- 只排除单个域名:
go env -w GOPRIVATE=gitlab.example.com - 排除子域名及所有路径:
go env -w GOPRIVATE=*.example.com - 多个域名用逗号分隔:
go env -w GOPRIVATE=gitlab.example.com,github.mycompany.com - 确认生效:
go env GOPRIVATE应输出对应值,且go mod download不再尝试访问sum.golang.org
为什么不能用 GOSUMDB=off 替代
GOSUMDB=off 会全局禁用所有模块的校验,包括公共依赖(如 golang.org/x/net),极大增加供应链风险。而 GOPRIVATE 是精准白名单:仅对指定域名跳过校验,其余依赖仍受 sum.golang.org 保护。这是 Go 官方明确区分“私有”与“公共”依赖的语义边界,不是权宜之计,而是设计原则。
配合 GOPROXY 避免代理干扰
即使设置了 GOPRIVATE,如果 GOPROXY 仍为默认值(含 proxy.golang.org),Go 在解析私有模块时可能先尝试走代理,再 fallback 到 direct,过程冗长且易超时。建议显式补全:
go env -w GOPROXY=https://goproxy.cn,directgo env -w GOPRIVATE=gitlab.example.com- 二者共存无冲突:
GOPROXY控制下载源,GOPRIVATE控制是否校验 —— 私有域名模块既不走代理,也不校验
真正容易被忽略的是:设置 GOPRIVATE 后,必须确保所有开发机、CI 节点、打包镜像都同步该环境变量;漏掉任意一处,构建就可能在校验阶段失败,且错误信息不会直接提示是 GOPRIVATE 缺失,而是表现为模糊的 checksum 或 network 错误。

















