Go私有模块需配对设置GOPROXY与GOPRIVATE,前者指定代理链,后者声明跳过代理的私有路径前缀;还需配置git凭据或改用SSH;规模化时应部署athens等私有代理统一管理。

Go私有模块无法下载:GOPROXY 和 GOPRIVATE 必须配对使用
Go 1.13+ 默认启用 GOPROXY="https://proxy.golang.org,direct",所有 go get 请求都会先走代理。如果你的私有模块域名(如 git.example.com/myteam/utils)没被排除,请求会直接发到官方代理并失败——它根本访问不到你的内网 Git 服务。
解决方法不是关掉代理,而是用 GOPRIVATE 明确告诉 Go:“这些前缀的模块跳过代理,直连”。必须和 GOPROXY 同时设置才生效:
export GOPROXY="https://proxy.golang.org,direct" export GOPRIVATE="git.example.com,github.company.internal"
注意:GOPRIVATE 值是逗号分隔的模块路径前缀(支持通配符 *,但不推荐用 *.example.com,因 Go 不做 DNS 解析,只做字符串前缀匹配)。
- 错误写法:
GOPRIVATE=*.example.com→ Go 不识别通配符子域,实际只匹配字面量"*.example.com" - 正确写法:
GOPRIVATE=git.example.com,api.example.com→ 明确列出所有用到的私有根路径 - 如果私有模块在 GitHub Enterprise,且地址为
https://gh.company.com/org/repo,则填gh.company.com,不是github.com
私有 Git 仓库认证失败:需要配置 git credential 或 GOPROXY 支持 Basic Auth
即使 GOPRIVATE 正确,go get 在直连私有 Git 时仍可能报 401 Unauthorized 或 fatal: could not read Username。这是因为 Go 调用的是系统 git 命令,而 git 默认不传凭据(尤其 HTTPS 地址)。
立即学习“go语言免费学习笔记(深入)”;
两种可靠方案:
- 用
git config --global credential.helper store,然后首次手动git clone https://git.example.com/myteam/utils输入账号密码,之后go get就能复用 - 改用 SSH 地址(如
git@git.example.com:myteam/utils.git),前提是~/.ssh/id_rsa已配好且 Git 服务器接受 SSH 连接;此时需确保go.mod中 module path 与 SSH 地址可映射(可通过replace或git config url."git@git.example.com:".insteadOf "https://git.example.com/"统一) - 不推荐在
GOPROXY里硬编码账号密码(如https://user:pass@git.example.com),URL 中明文密码易泄露且部分 Git 服务拒绝解析
公司级私有模块代理:athens 或 goproxy.io 自建服务更可控
当团队规模扩大、模块数量增多,靠每个开发者手动配 GOPRIVATE 和本地 git credential 会失控。这时应部署私有 Go 代理(如 athens),它既能缓存公有模块,又能按规则代理私有模块请求(例如匹配 git.example.com/** 的请求自动转发到内部 GitLab API,并注入 Token)。
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
关键配置点:
- athens 配置文件中
downloadmode: "sync"确保私有模块拉取成功后才返回,避免go build时因缓存未就绪失败 - 把 athens 地址设为唯一
GOPROXY:export GOPROXY="http://athens.company.local",同时清空GOPRIVATE(由 athens 内部规则控制哪些走代理、哪些直连) - athens 需配置 OAuth2 或 Personal Access Token 访问内部 Git,不能依赖用户本地凭据
自建成本略高,但解决了凭据分散、审计缺失、构建不可重现等问题。
go.mod 中 replace 指向本地路径:仅限开发调试,切勿提交到主干
有人为绕过私有模块网络问题,在 go.mod 里写:
replace example.com/mylib => ../mylib。这在单机开发时有效,但会导致 CI 构建失败(CI 环境没有
../mylib)、其他协作者无法拉取、版本信息丢失(go list -m all 显示 indirect 或本地路径而非真实 commit hash)。
真正该做的只有两件事:
- 确保私有模块已打 tag(如
v1.2.0),且go.mod中引用的是标准语义化版本:example.com/mylib v1.2.0 - 所有环境(本地、CI、生产镜像)统一通过
GOPROXY + GOPRIVATE或私有代理拉取,保持模块来源一致
replace 是临时手术刀,不是拐杖。用一次就要记着删掉,否则半年后没人记得为什么 go test 在某台机器上突然不通过。









