gonoproxy和gonosumdb必须分开配置,因二者分别控制代理请求与校验和查询,逻辑独立:gonoproxy决定是否绕过goproxy,gonosumdb决定是否跳过sum.golang.org校验;仅设goprivate不足,需显式配置两者以避免凭证泄露或校验失败。

为什么GONOPROXY和GONOSUMDB必须分开配
GONOPROXY控制「是否走代理」,GONOSUMDB控制「是否查校验和」,两者逻辑独立、互不替代。只设GOPRIVATE而漏掉GONOPROXY,Go仍会把私有模块请求发给GOPROXY(可能泄露凭证);只设GONOSUMDB却不设GONOPROXY,Go会先尝试代理下载,再校验失败——此时已暴露了内网地址或认证信息。
常见错误现象:go mod download卡在reading https://goproxy.cn/your-internal-repo/@v/v1.0.0.info: 404 Not Found,但你明明没让代理处理它——问题就在GONOPROXY没配,Go默认把所有模块都扔给GOPROXY。
-
GOPRIVATE只是GONOPROXY和GONOSUMDB的默认值来源,不是等价替代:它只在你没显式设置后两者时才生效 - 若私有模块路径是
git.internal.company.com/mylib,推荐写法:go env -w GONOPROXY=git.internal.company.com+go env -w GONOSUMDB=git.internal.company.com - 支持通配符,如
go env -w GONOPROXY="*.company.com",但注意*不能跨一级域名(*.com无效)
GONOPROXY配置后go mod download仍走代理?检查这三点
即使设置了GONOPROXY,go mod download还是发请求到https://goproxy.cn,大概率是匹配规则没生效。Go用前缀匹配,不是正则,也不是子域名自动继承。
使用场景:公司 GitLab 地址为gitlab.internal.company.com,模块路径为gitlab.internal.company.com/team/lib,但GONOPROXY=company.com完全不匹配——因为company.com不是该路径的前缀。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 必须写完整前缀:
go env -w GONOPROXY=gitlab.internal.company.com或go env -w GONOPROXY="gitlab.internal.company.com/"(末尾/可选,但加了更明确) - 多个域名用逗号分隔,**不能有空格**:
go env -w GONOPROXY=gitlab.internal.company.com,bitbucket.internal.company.com - 运行
go env GONOPROXY确认输出是你设的值;如果输出为空,说明没生效(可能是shell未source、IDE缓存、或被go.work覆盖)
GONOSUMDB配错导致verifying xxx: checksum mismatch
当go get报verifying github.com/xxx@v1.2.3: checksum mismatch,且你确认模块来自内网仓库,问题往往出在GONOSUMDB没覆盖到实际模块路径——Go校验时会按go.sum里记录的完整路径去sum.golang.org查,若路径不在GONOSUMDB列表中,就强制走公网校验,必然失败。
参数差异:模块路径和GONOSUMDB条目必须严格前缀匹配。比如模块导入路径是git.internal.company.com/api/v2,但你只设了GONOSUMDB=git.internal.company.com,这是对的;但如果设成GONOSUMDB=internal.company.com,就不匹配。
- 验证方式:执行
go list -m -f '{{.Dir}} {{.Sum}}' git.internal.company.com/api/v2,看是否跳过校验(无sum.golang.org相关日志即成功) - 若模块路径含版本后缀(如
git.internal.company.com/lib/v3),GONOSUMDB仍只需写git.internal.company.com——Go自动按前缀截断匹配 - 不要滥用
go get -insecure临时绕过,它影响整个命令生命周期,且掩盖真实配置问题
企业内网环境:GONOPROXY和GONOSUMDB必须与GOPROXY协同
在完全隔离的内网 CI 或 air-gapped 环境中,GOPROXY指向内部代理(如https://goproxy.internal),此时GONOPROXY和GONOSUMDB的作用是「确保私有模块不被误判为公共模块」,而非跳过代理——它们要配合代理服务本身的能力。
性能 / 兼容性影响:如果内部代理不支持私有模块索引(比如只缓存github.com),而你又没配GONOPROXY,Go就会把git.internal.company.com/xxx也发给它,返回404后才 fallback 到 direct(如果还开着的话),拖慢构建速度。
- 正确组合:
go env -w GOPROXY=https://goproxy.internal.company.com+go env -w GONOPROXY=git.internal.company.com+go env -w GONOSUMDB=git.internal.company.com - 此时
git.internal.company.com模块由代理直连拉取(代理自己处理认证),不走sum.golang.org校验,也不经过公共 GOPROXY 链路 - 切记:
direct不能出现在GOPROXY值里——内网没外网出口,fallback 到 direct 就是失败
GONOPROXY和GONOSUMDB一旦漏掉一个字符,Go 就照常走默认逻辑,不会报错提醒。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










