私有模块拉取失败主因是Go默认跳过认证流程,需设GOPRIVATE精确匹配模块路径前缀(如git.internal.company.com)以禁用proxy和sumdb,再配合Git层SSH密钥或HTTPS凭证完成认证。

私有模块拉取失败时,先确认是不是根本没走认证流程
Go 默认把所有模块当公开源处理,go get 根本不会尝试登录你的私有 Git 服务器——这不是网络或 token 问题,而是 Go 工具链压根没触发认证。常见报错如 module not found 或 unknown revision,往往是因为 GOPRIVATE 没设对,导致 Go 还在走公共代理或校验逻辑。
必须显式告诉 Go:“这个路径下的模块是私有的,别走 proxy,也别查 sumdb,直接交给 git 去拉。” 否则 go mod download 会静默跳过认证环节,连 401 都不报。
-
GOPRIVATE必须精确匹配模块路径前缀,比如模块地址是git.internal.company.com/team/lib,就得设成export GOPRIVATE=git.internal.company.com,不能写成internal.company.com - 多个域名用逗号分隔,中间不能有空格:
export GOPRIVATE=git.internal.company.com,api.internal.company.com - 验证是否生效:
go env GOPRIVATE应输出对应值;再运行go list -m all,私有模块行不应出现verifying提示
没有 token 时,用 SSH 方式绕过 HTTPS 认证依赖
HTTPS 协议拉取私有模块必须带凭证(token 或密码),但 SSH 不依赖 HTTP 层认证,只要本地 ssh-agent 已加载私钥、远程仓库已绑定公钥,go get 就能静默通过。这是无公网凭证场景下最稳的 fallback 方案。
关键在于模块路径和 Git 地址一致:如果仓库 URL 是 git@git.internal.company.com:team/lib.git,那么 go.mod 中的 module 行就必须写成 module git.internal.company.com/team/lib,不能省略域名或改用别名。
立即学习“go语言免费学习笔记(深入)”;
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 检查 SSH 是否通:
ssh -T git@git.internal.company.com能打印欢迎信息才算就绪 - 确保
~/.ssh/config里有对应 Host 配置,避免因端口或用户别名导致解析失败 - 如果用的是自建 Git 服务且监听非标准端口(如
:2222),GOPRIVATE也得带上端口:git.internal.company.com:2222
离线或受限环境里,用 go mod vendor + 手动拷贝替代实时拉取
当既没有公网、也没有任何凭证(SSH 私钥或 token)时,唯一可靠方式是提前在可联网机器上完成依赖固化,再把完整代码树带进隔离环境。此时 go mod vendor 不是可选项,而是必需步骤。
注意:vendor 目录只包含源码,不包含 $GOPATH/pkg/mod/cache 中的归档包。所以必须在联网机上先跑 go mod download,再执行 go mod vendor,最后把整个项目目录(含 vendor/ 和 go.modgo.sum)一起打包带走。
- 离线机上要禁用代理:
export GOPROXY=direct,否则go build仍会尝试连接proxy.golang.org - 构建前运行
go mod verify确认go.sum与vendor/内容一致,避免因手动修改导致校验失败 - 若项目含 cgo 依赖,记得一并拷贝对应平台的头文件和静态库,否则
go build会卡在 C 编译阶段
GOINSECURE 不是认证方案,只是跳过 TLS 校验的补丁
有些内网 Git 服务用的是自签名证书或 HTTP 协议,这时 go get 会因 TLS 验证失败退出,并表现为 checksum mismatch 或连接超时。但这和“没凭证”是两回事——它不解决认证问题,只解决证书信任问题。
设置 GOINSECURE 后,Go 会允许跳过 HTTPS 证书校验,但仍需 Git 层能正常发起请求。如果 Git 本身因证书报错(比如 SSL certificate problem),那还得额外配 git config --global http.sslVerify false,二者必须配合使用。
-
GOINSECURE值必须与模块路径完全一致,例如模块是git.internal.company.com/team/lib,就得设export GOINSECURE=git.internal.company.com - 切勿在生产环境长期启用
GOINSECURE,它会让中间人攻击成为可能 - 如果 Git 服务只开放 HTTP(非 HTTPS),
GOINSECURE必须设置,否则 Go 会强制重定向到 HTTPS 并失败
go get 就会安静地失败,连错误提示都未必给你。

















