临时设置 goproxy 只对当前命令生效的最直接方法是使用环境变量前缀,如 goproxy=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,https://goproxy.cn,direct go mod download,该方式不影响全局配置且 multiple proxy 须以 direct 结尾兜底。

临时设置 GOPROXY 只对当前命令生效
想换代理但又不想动全局配置,最直接的办法就是用环境变量前缀临时覆盖。Go 工具链会优先读取当前 shell 环境中的 GOPROXY,而不是 go env 里存的值。
比如用清华源临时拉依赖:
GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,https://goproxy.cn,direct go mod download
这条命令只影响这次 go mod download,执行完后 go env GOPROXY 输出不变,也不会污染其他终端或后续命令。
- 多个代理用英文逗号分隔,
direct必须放在最后作为兜底 - 不能写成
GOPROXY=https://goproxy.cn go mod download—— 缺少direct时,遇到 404 就直接失败,不会 fallback - 如果只是调试私有模块,可搭配
GONOSUMDB一起设:GOPROXY=direct GONOSUMDB="git.internal.company.com/*" go build
用 go env -w 临时改,但记得还原
有些场景下需要连续跑几条命令(比如 go mod tidy && go build),挨个加前缀太麻烦。这时可以用 go env -w 改,但必须手动还原,否则下次打开新终端还生效。
操作步骤:
go env -w GOPROXY="https://goproxy.cn,direct"<br>go mod tidy<br>go build<br>go env -u GOPROXY
go env -u GOPROXY 是关键——它把变量从 go env 的持久化存储里删掉,恢复到之前的状态(通常是空或系统默认值)。
- 别用
go env -w GOPROXY=""清空,Go 1.21+ 默认值是https://proxy.golang.org,direct,空字符串反而会让 Go 回退到这个默认值,不是你想要的“无代理” - 如果忘了还原,新开终端执行
go env GOPROXY就能立刻发现异常 - CI 脚本里慎用这种方式,容易残留;推荐始终用前缀方式
GO111MODULE=off 不是代理方案,别混用
看到有人试图用 GO111MODULE=off 绕过模块代理,这是误解。这个环境变量控制的是是否启用 Go Modules,和代理完全无关。设成 off 后,Go 会退回 GOPATH 模式,所有依赖都从 $GOPATH/src 找,根本不会走 GOPROXY,也拉不到任何远程模块。
典型错误现象:
-
GO111MODULE=off go get github.com/sirupsen/logrus报错no required module provides package - 即使设置了
GOPROXY,只要GO111MODULE=off,代理就完全失效 - 真正要禁用代理,只该设
GOPROXY=direct,而不是关模块系统
企业内网下 direct 不可用时怎么临时处理
内网环境禁用了直连(direct),但又不能改全局 GOPROXY,这时候得靠代理列表兜底。关键是确保至少一个代理地址在内网可达,且不依赖 direct。
例如:
GOPROXY=https://my-goproxy.internal.company.com go mod download
注意三点:
- 去掉
,direct后缀,否则 Go 仍会尝试直连,可能被防火墙拦截导致超时 - 提前确认该代理支持你要拉的模块,尤其是私有域名(如
git.internal.company.com/mylib) - 若代理不校验 checksum,需同步加
GONOSUMDB=git.internal.company.com/*,否则go build会因校验失败退出
临时代理这事,核心就一条:别让 GOPROXY 变成持久状态。前缀方式最安全,go env -w + -u 是次选,而任何涉及 GO111MODULE 或修改 ~/.bashrc 的操作,都算越界。











