Go proxy 配置不生效需检查 GOPROXY 是否被覆盖,私有代理须置列表首位;401/403 因 Go 不自动传认证,需配 netrc;缓存不更新需调低 Nexus/JFrog TTL;indirect 问题多因索引缺失或 GOPRIVATE 不匹配。

Go proxy 配置不生效?检查 GOPROXY 环境变量是否被覆盖
Go 1.13+ 默认启用代理模式,但企业环境里 GOPROXY 常被 IDE、shell profile 或 CI 脚本悄悄重写。最常见的是 go env -w GOPROXY=https://proxy.golang.org,direct 这类命令残留,它会把私有仓库地址挤掉。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 运行
go env GOPROXY确认当前值,不是go env -w查看的“写入值” - 私有代理必须放在逗号分隔列表最前面,例如:
GOPROXY=https://nexus.example.com/repository/goproxy/,https://proxy.golang.org,direct - 若用 JFrog Artifactory,路径必须是
/artifactory/api/go/<repo-key></repo-key>,不是 UI 页面 URL;Nexus 则是/repository/<repo-name>/</repo-name> - Windows 用户注意:PowerShell 里用
$env:GOPROXY="...",cmd 里用set GOPROXY=...,两者互不继承
go get 报 401 或 403?认证头没传给私有代理
Go client 不自动携带 HTTP Basic Auth,即使你在浏览器能登录 Nexus/JFrog,go get 仍会 401。这不是权限配置错,是 Go 工具链压根没发凭证。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 用
go env -w GOPRIVATE=example.com/internal标记私有域名(支持通配符如*.corp.example.com),否则 Go 会跳过代理直连 - 凭据必须通过
netrc文件提供:在用户主目录下建~/.netrc,内容为machine nexus.example.com login admin password apikey-xxx - JFrog 用户注意:密码字段填 API Key,不是 UI 密码;Nexus 3.21+ 支持 token,但需开启
anonymous access才能让 Go client 正常 fallback - 验证方式:手动
curl -v -u admin:apikey-xxx https://nexus.example.com/repository/go-proxy/,看响应头是否有X-Go-Import
module proxy 缓存不更新?检查 Nexus/JFrog 的代理策略
Nexus 默认缓存 3 小时,JFrog 默认 12 小时——这意味着你刚推的新 tag,go get mymod@v1.2.3 可能拉到旧版本。这不是 Go 本地缓存问题,是上游代理层卡住了。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- Nexus:进 Repository →
go-proxy→ Configuration → HTTP → 把Cache Timeout (minutes)改成1(最小值) - JFrog:Admin → Repositories →
go-virtual→ Advanced →Metadata Retrieval Cache Period (sec)设为60 - 强制刷新某模块:删 Nexus/JFrog 对应 repo 的
cache子目录(路径类似/nexus-data/cache/go-proxy/),或直接重启服务 - 避免依赖缓存:CI 中加
go clean -modcache,但治标不治本,核心还是调低代理层 TTL
go list -m all 显示 indirect?私有模块没被正确索引
当你看到 mycompany.com/lib v0.1.0 // indirect,说明 Go 认为这个模块没被直接 import,实际可能是 Nexus/JFrog 没生成正确的 index.json 或 @v/v0.1.0.info 元数据。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 确认模块根目录有
go.mod,且module行域名与GOPRIVATE匹配(如module mycompany.com/lib) - 手动触发索引:对 Nexus,在
go-proxyrepo 页面点 “Rebuild metadata”;JFrog 则执行curl -X POST "https://jfrog.example.com/artifactory/api/storage/my-go-virtual?recursive=1&includeFolders=1" - 检查
go list -m -json mycompany.com/lib输出中的Origin字段,如果是direct而非代理 URL,说明GOPRIVATE没生效或域名不匹配 - 别用
replace在 go.mod 里硬指定本地路径,这会让go mod vendor和 CI 完全失效
真正麻烦的不是配置几行环境变量,而是每个环节都可能静默失败:netrc 权限不对、GOPRIVATE 域名少了个点、Nexus 缓存时间比你想象的长得多。调试时优先查 go env 和 curl -v,别急着改代码。










