必须配置GONOPROXY和GONOSUMDB排除内网域名,并设置GOPROXY=https://goproxy.cn,direct兜底;replace指向本地路径会导致CI构建失败,离线构建需关闭GOSUMDB。

go mod 无法拉取公司内网 Git 模块
直接执行 go build 或 go mod tidy 时,遇到类似 Get "https://git.internal.company.com/my/lib/@v/v1.2.0.info": dial tcp: lookup git.internal.company.com: no such host 或 404 Not Found,基本就是 Go 尝试走代理去拉私有仓库——但代理根本访问不到内网地址。
必须明确告诉 Go:这个域名不走代理,也不校验 checksum。
-
go env -w GONOPROXY="git.internal.company.com"—— 排除该域名所有子路径(如git.internal.company.com/my/lib、git.internal.company.com/team/utils) -
go env -w GONOSUMDB="git.internal.company.com"—— 和GONOPROXY值完全一致,否则go mod download会因校验失败退出 - 多个域名用英文逗号分隔,不支持通配符(
*.internal.company.com无效),只能写全git.internal.company.com,svn.internal.company.com
GOPROXY 配置要带 direct 兜底
企业环境常混合使用公有模块(如 github.com/sirupsen/logrus)和私有模块。若 GOPROXY 只设为 https://goproxy.cn,遇到私有域名时会直接报错,而不是 fallback 到直连。
正确写法是:
立即学习“go语言免费学习笔记(深入)”;
go env -w GOPROXY=https://goproxy.cn,direct
注意:direct 必须小写、无空格、放在末尾。Go 会按顺序尝试代理,直到成功或走到 direct。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 如果漏掉
direct,私有模块拉取失败且不提示“可尝试直连”,只卡在超时或 404 - 不建议设成
GOPROXY=direct全局直连——公有模块下载慢、易失败,尤其在 CI 环境中 - CI 脚本里可临时覆盖:
GOPROXY=https://goproxy.cn,direct go mod download all
replace 指向内网路径时,go mod download 不生效
有些团队用 replace 把私有模块映射到本地开发路径,例如:
replace github.com/company/auth => ./internal/auth
这种写法下,go mod download 完全忽略它——因为 Go 认为这是本地路径,无需下载。但 go build 仍会读取该目录,一旦 CI 机器上没这个路径,就编译失败。
- CI 环境中,应避免
replace指向相对路径;改用replace github.com/company/auth => git.internal.company.com/company/auth v1.2.0(即指向真实 Git 地址+版本) - 若必须本地开发调试,可在
.gitignore中排除./internal/auth,并确保 CI 构建前先git clone对应仓库到该路径 -
go list -m all输出里不会显示被replace的模块,容易误判依赖是否齐全
离线构建前必须验证 checksum 校验开关
即使所有模块都已 go mod download all 下好,构建时仍可能触发网络请求——原因常是 GOSUMDB 未关。
执行:
go env -w GOSUMDB=off
否则 Go 会在构建阶段尝试连接 sum.golang.org 校验公有模块,而私有模块的 GONOSUMDB 不影响此行为。
-
GOSUMDB=off是离线构建刚需,不是可选项 - 设完后运行
go mod verify确认本地缓存无篡改;若失败,说明缓存损坏,需go clean -modcache后重下 - 企业镜像源(如自建 Athens)若支持 checksum 服务,可设
GOSUMDB=your-athens.example.com替代off,但需额外运维

















