注:Golang 从1.13开始默认使用Go Mod,请切换至Go Mod并配置goproxy

问题描述

国内使用go get命令时,Google 相关的域名例如golang.org经常被墙。

方法 1:使用 Gopm

Gopm 目前已停止维护

使用gopm get命令替代go get

> go get -u github.com/gpmgo/gopm

> gopm
NAME:
   Gopm - Go Package Manager

USAGE:
   Gopm [global options] command [command options] [arguments...]

VERSION:
   0.8.8.0307 Beta

COMMANDS:
   list         list all dependencies of current project
   gen          generate a gopmfile for current Go project
   get          fetch remote package(s) and dependencies
   bin          download and link dependencies and build binary
   config       configure gopm settings
   run          link dependencies and go run
   test         link dependencies and go test
   build        link dependencies and go build
   install      link dependencies and go install
   clean        clean all temporary files
   update       check and update gopm resources including itself
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --noterm, -n         disable color output
   --strict, -s         strict mode
   --debug, -d          debug mode
   --help, -h           show help
   --version, -v        print the version

方法 2:install from Github

参见 解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题

方法 3:配置终端代理

阅读get.go源码会发现,go get命令通过git clone命令将远程仓库的代码拉取到本地

根据官方 golang/go - GoGetProxyConfig | Github 的说明,需要设置git的代理:

> git config [--global] http.proxy http://proxy.example.com:port

然而并没有起作用。。

我在LinuxWindows的机器上都开启了Shadowsocks代理,本地端口1080

搜索了一圈之后发现,需要设置http_proxyhttps_proxy这两个环境变量

for Linux

我在CentOS 7.5的机器上已经使用ProxyChains-NG作为终端命令的代理程序,这样可以很方便的在需要代理的时候在命令前加上pc前缀(之前设置了alias pc='proxychains4')。

而添加http_proxy环境变量后,所有终端命令的 HTTP 连接都会走代理,这并非我所期望的。因此不能直接在~/.zshrc中添加环境变量。

我的解决方案是:将设置http_proxyhttps_proxy环境变量的export命令单独写在 Shell 脚本中,需要走代理时直接source即可。

首先以下内容另存为export-http-proxy.sh

#!/bin/bash
export http_proxy=socks5://127.0.0.1:1080 # 代理地址
export https_proxy=$http_proxy
export | grep http

之后添加执行权限

> chmod +x export-http-proxy.sh

最后

> source export-http-proxy.sh
http_proxy=socks5://127.0.0.1:1080
https_proxy=socks5://127.0.0.1:1080

这样就可以直接go get被墙的包了。

for Windows

Windows 就非常简单了,直接设置以下环境变量

http_proxy socks5://127.0.0.1:1080  # 代理地址
https_proxy socks5://127.0.0.1:1080

要想临时添加代理,只需将以下内容保存为http-proxy.bat,需要时执行即可:

set http_proxy=socks5://127.0.0.1:1080
set https_proxy=%http_proxy%

参考文章

  1. Gopm Registry
  2. Gopm | Github
  3. golang/go - GoGetProxyConfig | Github
  4. go get 使用代理 | CSDN
  5. go get 命令被墙问题 | CSDN
  6. 解决go get timeout | CSDN
  7. Golang 依赖包下载时候代理设置 | CSDN
  8. go get 设置代理 | CSDN
  9. go get 命令被墙问题 | CSDN
  10. 国内的 go get 问题的解决 | CSDN
  11. go get 国内解决办法汇总 | CSDN
  12. 让 go get 显示进度 | CSDN