先把 Go 模块代理与网络代理分清
适用于使用 go.mod 的 Go 项目,涵盖 Windows、macOS 和 Linux;环境变量前缀示例仅适用于 macOS/Linux 的 bash 或 zsh。先用 go version 记录安装版本,遇到本机不识别的参数,以 go help 对应命令为准。本文核对官方文档,未运行你的依赖下载或构建。
GOPROXY 要求的是提供 Go 模块下载协议的服务。普通本地 HTTP/SOCKS 代理只转发网络请求,并不会因此成为 Go 模块仓库。把客户端本地端口写进 GOPROXY,可能得到错误页面或不符合协议的响应。
go version
go env GOPROXY GOSUMDB GOPRIVATE GONOPROXY GONOSUMDB GOENV- 记录首次失败的模块路径、精确版本和请求主机。把模块内容下载、校验服务访问、私有仓库登录分别记下;不要只保留最后一行退出码。
- 检查当前终端变量、IDE/CI 配置与以前用 go env -w 保存的默认值是否相符。不要为了排查直接把这些值全部清空。
为什么写了 direct 仍不自动直连
| GOPROXY 写法 | 回退条件 | 排查意义 |
|---|---|---|
| https://proxy.golang.org,direct | 前一服务返回 404 或 410 才继续 | 超时或其他错误不会因此自动改走源码仓库 |
| URL_A|URL_B | 前一服务发生任意错误后继续 | 会扩大回退范围,不能随意替换组织规定的逗号 |
| direct | 直接向版本控制来源获取模块 | 仍可能需要 Git 认证和校验服务;不保证避开所有网络问题 |
只对已知失败的固定版本做一次验证
先保存项目中尚未提交的 go.mod/go.sum 改动。下面 MODULE_PATH@VERSION 是占位文本,必须替换成报错中那一个准确模块和版本,保留引号即可;不要原样执行,也不要用 latest 把排障变成升级。命令会访问网络、写模块缓存,在项目上下文中还可能更新校验记录,不需要管理员权限。
go mod download -json "MODULE_PATH@VERSION"查看退出结果和 JSON 中是否有 Error,成功结果可包含 Dir、Zip、Sum 等字段。已存在的缓存也会让下载命令成功,因此这一步只能证明该版本当前可用;不能仅凭成功就声称已验证新的网络路线。
只有确认目标是公开模块、且组织允许访问官方公开模块服务时,才可在 macOS/Linux 临时给这一个进程指定下面的值;它不会执行 go env -w。Windows 本文不提供另一套变量修改脚本,可先按上面的读取结果由开发环境维护者调整,避免遗留全局改动。
GOPROXY="https://proxy.golang.org,direct" go mod download -json "MODULE_PATH@VERSION"校验服务和私有模块各自处理
| 错误线索 | 应做的检查 |
|---|---|
| 模块文件已到手,校验服务请求失败 | 核对失败主机和组织网络路径;不是再换一次源码地址 |
| 私有模块被公开服务查询 | 核对 GOPRIVATE 及显式 GONOPROXY/GONOSUMDB 是否符合模块前缀 |
| 私有源码仓库认证失败 | 检查该运行环境自己的 Git/仓库授权;GOPRIVATE 不会发放权限 |
| 校验和不一致 | 保留模块、版本和错误信息,核实来源;不要关校验后继续构建 |
GOPRIVATE 为 GONOPROXY 和 GONOSUMDB 提供默认匹配范围;若后两者已有显式配置,不能假设改前者就够了。公司代理统一托管所有模块时,还可能要求私有模块继续经过公司服务,应沿用管理员提供的组合。不要把 GOSUMDB=off 或广泛的 GOINSECURE 当作网络修复。
验证成功的范围,并恢复原设置
- 固定版本下载可用后,再运行项目原来的构建或测试。检查 go.mod/go.sum 的差异,仅保留确认需要的变更,不覆盖此前已有的用户修改。
- 需要检查已下载缓存有无后续改动时,可在项目目录执行 go mod verify;它不是网络连通性测试,也不表示项目测试通过。
- 前缀变量示例会随进程结束失效。如果此前另用 go env -w 改过值,应恢复排查前记录;仅当原来没有持久默认值时才考虑用 go env -u 去掉本次新增项。它不会清除 shell 自己设置的变量。
- 保留错误主机、失败阶段、Go 版本和脱敏配置差异作为求助信息,不公开私有模块完整路径、代理 URL 内的认证信息或访问令牌。
go mod verify