goprivate 必须精确配置域名、子域和端口,如 git.example.com:2222;通配符 * 仅作用于路径前缀,多个值用英文逗号分隔且不可有空格;仅设 goprivate 不解决认证问题,需单独配置 git 凭据。

Go 要拉取自建私有仓库的模块,光有 Git 服务还不够——GOPRIVATE 必须设对,否则 go get 会绕过你的私有地址、直连 proxy.golang.org 或报 unknown revision。
GOPRIVATE 域名匹配必须精确到子域和端口
Go 的匹配规则是前缀匹配,不支持自动包含子域名或省略端口。设成 example.com 不会覆盖 git.example.com,更不会覆盖 git.example.com:2222。
- 正确写法:
go env -w GOPRIVATE=git.example.com:2222,dev.git.example.com,my.internal - 通配符
*只作用于路径前缀,如git.example.com/*表示所有以该域名开头的模块路径,但git.example.com本身不被*.example.com匹配 - 多个值用英文逗号分隔,**不能有空格**,否则 Go 会忽略整个变量
- 设置后运行
go env GOPRIVATE验证是否生效
只设 GOPRIVATE 不解决 401 或 permission denied
GOPRIVATE 只是告诉 Go:“别走代理、别校验 checksum”,它不提供任何认证能力。Git 层的登录凭证仍需单独配置。
- HTTPS 方式:确保
git clone https://git.example.com/internal/lib能成功(依赖~/.netrc或git config --global credential.helper store) - SSH 方式:Go 会调用系统
git命令,所以只要ssh -T git@git.example.com通,go get就能走 SSH - 如果报
401 Unauthorized,问题一定在 Git 层,和 Go 无关;检查git config --get-all credential.helper和~/.netrc权限(应为600)
GOINSECURE 和 GOPROXY 需按需协同设置
如果你的私有 Git 服务只提供 HTTP(无 TLS),必须加 GOINSECURE;若同时用了企业级 Go 代理(如 Athens),还需调整 GOPROXY 排除私有域。
- HTTP 仓库:执行
go env -w GOINSECURE=git.example.com:8080(端口不可省略) - 混合代理场景:设
GOPROXY=https://athens.company.com,direct,再靠GOPRIVATE确保私有模块跳过代理 - 避免误配:不要把私有域名写进
GOPROXY,否则 Go 会尝试向代理请求,而代理大概率不支持你的私有地址
最容易被忽略的是:Go 对 GOPRIVATE 的匹配发生在解析模块路径时,不是运行时。一旦 go.mod 里写了 require git.example.com/internal/lib v1.2.3,Go 就会严格按你配置的 GOPRIVATE 列表比对——少一个字符、多一个空格、漏掉端口,都会导致 fallback 到公共代理或失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











