根本原因是go未识别私有路径,因goprivate要求完整域名前缀左对齐精确匹配,如git.example.com/*才匹配子路径,单写git.example.com不匹配github.com/my-org/;且需检查gonoproxy覆盖、ci环境未生效、git认证失败或ssl配置问题。

为什么GOPRIVATE设了还是走代理?
根本原因是 Go 没识别出你要跳过的私有路径 —— 它只认 GOPRIVATE 里列出的**完整域名前缀**,且匹配是「左对齐精确前缀匹配」。比如你设了 GOPRIVATE=git.example.com,那 git.example.com/foo/bar 会直连,但 github.com/my-org/private 不会,哪怕你写了 github.com/my-org,Go 也会要求你写成 github.com/my-org/*(通配符必须显式带上)。
-
GOPRIVATE值中不能有空格,多个条目用英文逗号分隔,例如:git.internal.company.com,github.com/my-team/* - 不支持正则或模糊匹配,
github.com/my-*或*.company.com都无效 - 如果模块路径是
ssh://git@gitlab.example.com/group/proj,GOPRIVATE必须填gitlab.example.com,不是git@gitlab.example.com - 检查是否被
GONOPROXY覆盖:若同时设置了GONOPROXY和GOPRIVATE,Go 优先用GONOPROXY;但GONOPROXY不影响校验(GOSUMDB),所以更推荐只用GOPRIVATE统一控制
怎么验证GOPRIVATE是否生效?
别只看 go env GOPRIVATE 输出,要观察实际请求行为。运行 go mod download -v,留意日志里每个模块的 fetch URL:
- 公有模块(如
golang.org/x/net)应显示从https://goproxy.cn/...拉取 - 私有模块(如
git.example.com/internal/pkg)应显示git -c core.autocrlf=false clone ...或GET https://git.example.com/...,**绝不能出现 proxy 地址** - 如果仍看到
https://goproxy.cn/git.example.com/...,说明GOPRIVATE没覆盖到,立刻检查拼写、通配符、逗号分隔格式
私有模块拉取失败还可能是 Git 协议问题
GOPRIVATE 只解决「是否走代理」,不解决「Git 能否连上」。常见卡在 git clone 阶段,错误如 authentication required、ssh: connect to host git.example.com port 22: Connection refused:
- HTTPS 私库:确保已配置 Git 凭据,运行
git config --global credential.helper store后手动git clone https://git.example.com/xxx输一次账号密码 - SSH 私库:确认
~/.ssh/id_rsa已添加到对应平台,且go.mod中模块路径是git@example.com:group/repo格式(不是 HTTPS) - 内网 GitLab/Gitee 自建站:检查是否启用了自签名证书,需额外设置
git config --global http."https://git.example.com/".sslVerify false(仅限可信内网)
CI/CD 中 GOPRIVATE 容易被忽略的点
CI 环境(如 GitHub Actions、GitLab CI)默认不加载用户 shell 配置,go env -w 设置不会自动生效:
- 必须在 CI 脚本里显式 export,例如:
export GOPRIVATE="git.internal.company.com,github.com/my-org/*" - Docker 构建时,要在
Dockerfile的ENV或构建参数中传入,不能依赖宿主机环境变量 - 某些 CI 平台(如 Bitbucket Pipelines)对环境变量名大小写敏感,务必用全大写
GOPRIVATE,不是goprivate - 若用
go mod vendor,GOPRIVATE仍需设置 —— vendor 只复制代码,不影响go mod download阶段的拉取逻辑
最常漏掉的是通配符和 CI 环境隔离 —— 设了 GOPRIVATE=github.com/my-org 却忘了加 /*,或者本地调试通了就以为 CI 没问题,结果构建机根本没配 Git 凭据或 SSH key。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











