私有模块拉取失败的典型错误是401 Unauthorized或sum.golang.org 404,根源在于未正确配置GOPRIVATE(需纯域名/通配符,不含协议)、GONOSUMDB和GOINSECURE(仅HTTP仓库需要),三者缺一不可且须实测验证。

私有模块拉取失败时的典型错误信息
执行 go mod tidy 或 go build 时遇到类似报错,基本就是私有包代理配置没到位:
module git.internal.company.com/lib/foo: reading git.internal.company.com/lib/foo/go.mod at revision v0.1.0: 401 Unauthorizedgo: git.internal.company.com/lib/foo@v0.1.0: verifying module: git.internal.company.com/lib/foo@v0.1.0: reading https://sum.golang.org/lookup/git.internal.company.com/lib/foo@v0.1.0: 404 Not Foundgo: git.internal.company.com/lib/foo@v0.1.0: Get "https://git.internal.company.com/lib/foo/@v/v0.1.0.info": dial tcp: lookup git.internal.company.com: no such host
这些不是网络不通,而是 Go 默认把私有域名当公开模块走 GOPROXY,结果被代理拒绝或校验失败。
GOPRIVATE 必须显式设置且不含协议前缀
GOPRIVATE 的作用是告诉 Go:“这个域名下的模块,别转发给代理,也别查 checksum 数据库,直接走 Git 协议拉。”但它对格式极其敏感:
- 值必须是纯域名或通配符,不能带
https://或路径,例如git.internal.company.com✅,https://git.internal.company.com❌ - 支持通配符,如
*.internal.company.com,但不支持路径匹配(git.internal.company.com/lib/*无效) - 多个域名用逗号分隔,**不能有空格**:
git.internal.company.com,github.com/myorg - 设置命令:
go env -w GOPRIVATE="git.internal.company.com,*.corp.example"
漏掉这一步,Go 就会坚持把私有地址发给 GOPROXY,而国内镜像或官方代理根本没法认证你的内网 Git。
立即学习“go语言免费学习笔记(深入)”;
GONOSUMDB 和 GOINSECURE 的配套条件
仅设 GOPRIVATE 还不够——如果私有仓库用的是 HTTP 协议,或没接入 Go 官方 checksum 数据库,还得补两块:
-
GONOSUMDB:跳过 checksum 校验。值与GOPRIVATE类似,例如go env -w GONOSUMDB="git.internal.company.com" -
GOINSECURE:允许对 HTTP 地址发起 Git 请求(绕过 TLS 强制)。只对未启用 HTTPS 的内网 Git 服务需要,例如go env -w GOINSECURE="git.internal.company.com" - 注意:
GOINSECURE不影响 HTTPS 地址;若私有 Git 已用 HTTPS,则无需设它
这三个变量是联动生效的:缺一不可,顺序无关,但必须全部在 go env 中可见。
验证配置是否真正生效
别只看 go env 输出,要实测:
- 运行
go env GOPRIVATE GONOSUMDB GOINSECURE,确认三者都非空 - 删掉本地缓存:
go clean -modcache,避免旧缓存干扰 - 新建空目录,
go mod init test,然后import "git.internal.company.com/lib/foo"并go mod tidy - 成功时应看到
git clone日志,而不是proxy.golang.org或sum.golang.org的请求
最容易被忽略的是缓存残留和多 shell 环境不一致——比如 VS Code 终端没 reload ~/.zshrc,导致 go env 显示已设,实际进程没读到。


















