GOPRIVATE必须显式设置以禁用私有模块的代理和校验,其值为逗号分隔的域名前缀(支持*通配),需与模块路径严格匹配,并配合GOPROXY="direct"避免fallback至公共代理。

GOPRIVATE 环境变量必须显式设置,否则 go 命令直接跳过私有域名校验
Go 在 1.13+ 默认启用模块代理(proxy.golang.org)和校验(sum.golang.org),所有非公共域名的模块都会被当作“公开可索引”处理——哪怕你本地能 git clone 通,go get 仍会报 module github.com/your-org/private-repo: reading https://proxy.golang.org/...: 404 Not Found。
根本原因:Go 不会自动猜测哪些域名是私有的,它只认 GOPRIVATE 列表里的前缀。没设,就全走代理;设了,才对匹配域名禁用代理和校验。
-
GOPRIVATE值是逗号分隔的域名或路径前缀,支持通配符*(如git.internal.company.com,github.com/my-team/*) - 必须在 shell 启动时就生效,推荐写进
~/.bashrc或~/.zshrc:export GOPRIVATE="git.example.com,github.com/internal/*"
- 设完别忘了重载配置或新开终端,用
go env GOPRIVATE验证是否生效
私有 Git 仓库地址要和 GOPRIVATE 前缀严格匹配,大小写和路径层级都不能错
Go 的模块路径(module 声明)和实际 go get 用的 URL 必须与 GOPRIVATE 中的前缀能做前缀匹配。比如模块声明是 module git.example.com/team/project,那 GOPRIVATE 就得包含 git.example.com,不能只写 example.com。
- 常见错误:把公司 GitLab 地址写成
https://gitlab.company.com,但GOPRIVATE设成了company.com→ 不匹配,仍走代理 - Git 仓库 URL 中带端口(如
git.example.com:2222)时,GOPRIVATE也得带端口,否则不匹配 - 模块路径含子组(如
git.example.com/a/b/c),GOPRIVATE写git.example.com/a就够,不用穷举到c
SSH 认证比 HTTPS 更稳定,但需确保 go 命令能复用 ssh-agent
用 HTTPS 拉私有库容易卡在凭据弹窗或 403,尤其 CI 环境。SSH 方式绕过密码/Token 输入,前提是 git 和 go 都能走 SSH 连接。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 确保
~/.gitconfig里有对应 host 别名,例如:[url "git@git.example.com:"]<br> insteadOf = https://git.example.com/
- 确认
ssh -T git@git.example.com能通,且go进程能访问到ssh-agent(Linux/macOS 通常没问题,Windows WSL 需检查SSH_AUTH_SOCK) - 如果用 GitHub 私有库,
GOPRIVATE=github.com/private-org/*+ SSH URL(github.com/private-org/repo)是最简路径
go mod download 和 CI 构建失败,大概率是 GOPROXY 没配合 GOPRIVATE 关闭
GOPRIVATE 只控制“是否走代理”,但它本身不改 GOPROXY 设置。如果你的 GOPROXY 是默认值(https://proxy.golang.org,direct),那私有模块仍会先被发往 proxy.golang.org,直到 404 后才 fallback 到 direct —— 这个过程慢、不可控,且可能暴露模块名。
- 正确做法:把
direct提前,或显式排除私有域,例如:export GOPROXY="https://proxy.golang.org,direct"<br>export GOPRIVATE="git.example.com"
→ Go 会先查 proxy,失败后直连;但更稳妥的是:export GOPROXY="direct"
(完全禁用代理,适合内网环境) - CI 脚本里务必导出这两个变量,不能只靠本地配置;Docker 构建时要在
Dockerfile中用ENV设置 - 运行
go list -m all可快速验证私有模块是否解析为direct源,而非 proxy 域名
最容易漏的是:开发机设了 GOPRIVATE,但 CI 环境没同步,或者 GOPROXY 没调成 direct,导致构建时反复超时或 403。域名匹配、环境变量生效范围、代理 fallback 行为——这三处任何一个出问题,依赖就拉不下来。

















