go111module=on 时 goprivate 必须显式设置,否则 go 命令会强制通过公共 proxy 拉取私有模块并校验 checksum,导致超时或校验失败;需用逗号分隔的 glob 模式(如 gitlab.internal,github.company.com/**)精确匹配 host 名,且确保环境变量在各上下文(docker、ci、ide)中生效。

GO111MODULE=on 时 GOPRIVATE 必须显式设置
Go 1.13+ 默认启用模块模式后,go 命令会无条件尝试走 proxy(如 proxy.golang.org)拉取所有模块,包括你本地的私有 Git 仓库。它不会自动识别 “这是公司内网地址,别走代理”。除非你告诉它:GOPRIVATE 里列出的域名,一律跳过 proxy 和 checksum 校验。
常见错误现象:go get private.company.com/repo 报错 verifying private.company.com/repo@v0.1.0: checksum mismatch 或直接超时 —— 因为 go 尝试从公共 proxy 查这个私有路径,当然找不到。
-
GOPRIVATE是一个以逗号分隔的 glob 模式列表,不是正则,支持*和**(后者匹配多级子路径) - 推荐写法:
export GOPRIVATE="gitlab.internal,github.company.com/**,bitbucket.company.com"—— 注意不带协议、不带路径前缀 - 如果用 SSH 地址(如
git@gitlab.internal:group/proj.git),GOPRIVATE只需覆盖主机名部分(gitlab.internal),go会自动匹配 - Windows 用户注意:PowerShell 用
$env:GOPRIVATE="...",CMD 用set GOPRIVATE=...,且需重启终端生效
SSH 认证失败:不是权限问题,而是 Go 调用 git 的方式不对
Go 不自己实现 Git 协议,而是调用系统 git 命令。所以 go get 走 SSH 时,实际是 git clone git@gitlab.internal:group/proj.git。如果你手动运行这行能成功,但 go get 失败,大概率是环境变量或 SSH 配置没被 git 继承到。
典型错误信息:fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
立即学习“go语言免费学习笔记(深入)”;
- 检查
git是否真的用了你的 SSH key:ssh -T git@gitlab.internal(不是go get,是纯 ssh 测试) - 确保
~/.ssh/config中 Host 别名没有干扰,比如Host gitlab.internal下写了IdentityFile,但 Go 启动的子进程没读到该文件 - Mac 上常见坑:Keychain 自动填充导致
ssh-agent没加载 key,运行ssh-add -K ~/.ssh/id_rsa(注意是-K,不是-k) - Linux/WSL:确认
ssh-agent已启动且SSH_AUTH_SOCK环境变量在go进程中存在(可用go env -w GOPROXY=direct+go list -m all 2>&1 | grep ssh观察真实调用命令)
go mod download 和 go get 对 GOPRIVATE 的处理差异
go mod download 会严格按 GOPRIVATE 列表跳过 proxy;而 go get 在更新依赖时,如果模块已存在于本地缓存($GOPATH/pkg/mod),可能绕过 GOPRIVATE 检查直接复用旧版本 —— 导致 checksum 错误或拉不到新 tag。
- 遇到 “明明设了
GOPRIVATE还报 checksum mismatch”,先清缓存:go clean -modcache - 强制刷新私有模块:
go get -u -v private.company.com/repo@main(加-v看真实 fetch 行为) - CI/CD 场景下,务必在
go mod download前确认GOPRIVATE已 export,否则流水线会卡在 proxy 超时 - 注意
go build本身不触发下载,但若go.sum缺失条目,首次go build可能隐式调用go get,行为不可控
Git URL 写法必须和 GOPRIVATE 匹配,大小写和端口都不能错
Go 解析 import 路径时,对 host 名做精确字符串匹配(不解析 DNS),GOPRIVATE=gitlab.internal 不会匹配 gitlab.internal:2222 或 GitLab.Internal。
- 检查
go.mod里的require行:是否用了完整 URL?例如require gitlab.internal/group/proj v0.1.0—— 这个 host 必须和GOPRIVATE完全一致 - 避免用 IP 地址(如
192.168.1.100):Go 不支持对 IP 做 glob 匹配,GOPRIVATE=192.168.*无效,必须用可解析的域名 - 如果私有 Git 服务监听非标准端口(如
gitlab.internal:2222),GOPRIVATE仍只写gitlab.internal,但import路径和git配置里必须显式带端口,例如git@gitlab.internal:2222/group/proj.git - 公司内部 DNS 有时返回 CNAME,但 Go 不跟随 CNAME,所以
GOPRIVATE必须填最终解析出的 A 记录主机名,而不是别名
最常被忽略的一点:GOPRIVATE 不继承父 shell,Docker 构建、systemd 服务、IDE 内置终端都可能没加载你的 profile —— 每次怀疑配置失效,第一反应不是改代码,而是 go env GOPRIVATE 看它当场返回什么。










