必须开启GO111MODULE=on,否则GOPROXY无效;GOPROXY=direct可禁用代理但需配合GOPRIVATE精确匹配私有域名及GOSUMDB=off关闭校验,三者缺一不可。

GO111MODULE=on 是前提,否则 GOPROXY 设置无效
很多用户设了 GOPROXY=direct 却发现私有模块还是走代理失败,根本原因是 GO111MODULE 没开。Go 会 fallback 到 GOPATH 模式,此时 go mod 命令压根不生效,GOPROXY 完全被忽略。
必须执行:
go env -w GO111MODULE=on
- 不要依赖 auto 模式 —— 它在
/tmp、~/Desktop等路径下常误判为非模块目录 - off 模式会彻底禁用模块机制,
go mod tidy直接报错not in a module - CI/CD 脚本里尤其要显式设置,某些基础镜像仍默认 auto
GOPROXY=direct 不等于“清空”,空字符串会被 fallback 到默认代理
写 go env -w GOPROXY="" 或删掉环境变量,Go 会自动用 https://proxy.golang.org,国内基本超时。真正禁用代理的唯一可靠方式是设为 direct:
go env -w GOPROXY=direct
-
direct表示:跳过所有代理,直接向go.mod里声明的源地址发起 HTTPS/SSH 请求 - 它不改变 Git 认证行为,也不关闭校验 ——
GOSUMDB仍会尝试查 checksum - Windows PowerShell 用户需写
$env:GOPROXY="direct",CMD 是set GOPROXY=direct
GOPRIVATE 必须精确匹配私有域名,否则 direct 也救不了
即使 GOPROXY=direct,如果没配 GOPRIVATE,Go 仍会对未匹配的私有路径(如 git.internal.company.com/lib)尝试查 proxy.golang.org,结果是 404 或 401。
立即学习“go语言免费学习笔记(深入)”;
正确配置示例:
go env -w GOPRIVATE=git.internal.company.com,github.com/my-org/*
- 不支持通配符
*.company.com,必须写前缀或带/* - 逗号后不能有空格,否则 Linux/macOS 下只生效第一个域名
- 匹配规则区分大小写,且必须与
go.mod中的 module path 完全一致
GOSUMDB=off 和 Git 凭据缺一不可
设了 GOPROXY=direct 和 GOPRIVATE 后,还可能卡在两处:
-
verifying github.com/xxx/yyy@v1.2.3: checksum mismatch→ 因GOSUMDB仍在校验,私有模块没发布到官方 sumdb -
fatal: could not read Username for 'https://git.internal.company.com'→ Git 认证失败
对应处理:
go env -w GOSUMDB=off
- 仅对
GOPRIVATE匹配的域名生效,不影响公共模块校验 - HTTPS 私仓:运行
git config --global credential.helper store,首次go mod download时输账号密码 - SSH 私仓:确认
ssh -T git@git.internal.company.com能通,且私钥已加载进 ssh-agent
最容易被忽略的是 GOPRIVATE 的匹配精度和 GOSUMDB=off 的作用域 —— 它们必须和 GOPROXY=direct 配合,缺一就会在拉取私有模块时静默失败或报错。


















