在编写go项目的过程中,往往会引入到外部的包。在github仓库有的,还能比较方便拉下来,但是往往很多go官方包是在golang.org的域名下,这是需要“有梯子”才能获取的。如果你未设置代理,你的go get xxx语句很可能会是这样:package golang.org/x/net: unrecognized import path "golang.org/x/net" (https fetch: Get https://golang.org/x/net?go-get=1: proxyconnect tcp: net/http: TLS handshake timeout)。很郁闷是吧?(╯﹏╰)
那么该问题应该如何处理呢?
针对有VPN和无VPN的情况,我整理出了几条解决方案。
有VPN的解决方案
如果你有自己境外服务器,那么问题就比较简单了。目前代理软件比较多,常用有ShadowSockets、polipo、proxychains-ng、cow等等。我使用的是ShadowSockets。
科学上网准备
若你是自己搭建的服务器,那么需要在ShadowSockets配置里,填入你的账号密码加密方式等等,这部分内容,自行出门百度。
若你是买的别人搭建好的,那么一般提供方都会给出配置好了的代理软件给你,代理配置就不用你自己劳心了。
当你配置好代理软件后,需要检验能否正常科学上网,推荐使用Google浏览器。首先需要安装浏览器代理插件SwitchyOmega,并对其进行配置。
注意,Shadowsocks的代理协议默认采取的是SOCKS5,不是HTTP(如果你的是http代理,本文后续socks5对应的地方改为http和https)。其默认端口是1080或者1086。
当你不确定是哪个端口时,在windows下的Shadowsocks软件里面的服务器设置里面会显示你的本地端口,在mac上面,你可以在命令台输入
lsof -i:1080
或者
lsof -i:1086
看哪个端口在监听,那么那个监听端口就是Shadowsocks对应的本地监听端口。将该端口填入SwitchyOmega配置。尝试登陆google网站,看能否正常科学上网。若不能,就得检查自己的配置问题或者该账号节点的有效性了。
go get代理设置
当能成功通过浏览器访问外网时,那证明你的科学上网代理设置成功了,但是现在仅仅只是对浏览器进行了代理,在命令台命令上,依然不会走代理,需要后续配置。
- 临时代理(只对当前命令台有效,亲测有效)
linux或mac下命令台命令
$ export http_proxy="socks5://127.0.0.1:1086/"
$ export https_proxy="socks5://127.0.0.1:1086/"
注意,这里的端口号,是代理软件监听的本地端口号。
window下命令台命令
set http_proxy=http://127.0.0.1:1080/
set https_proxy=https://127.0.0.1:1080/
在设置代理之后,就可以使用go get了
go get golang.org/x/net
- 永久代理(不推荐,因为你很多时候你不用访问外网)
方法1
vim ~/.bash_profile
在里面添加两行语句
export http_proxy="socks5://127.0.0.1:1086/"
export https_proxy="socks5://127.0.0.1:1086/"
方法2
因为go get基于git(当然你也可能用的其他版本控制软件),可设置git代理(亲测,未必有效)。
git config --global http.proxy 'socks5://127.0.0.1:1086'
git config --global https.proxy 'socks5://127.0.0.1:1086'
查看设置成功否
git config --global http.proxy
git config --global https.proxy
关闭全局代理
git config --global unset http.proxy
git config --global unset https.proxy
无VPN的解决方案
方法1 使用gopm代替go下载镜像(2019/12/31之后不再提供支持)
因为golang.org上的包在github上都有镜像,可以通过gopm下载镜像(注意,gopm只是下载源码,并未编译,go get会下载并编译)。
安装gopm
go get -u github.com/gpmgo/gopm
gopm的可执行二进制文件存在于你的GOPATH下和src并列的bin目录下,命令台路径移该目录下,即可执行gopm命令。(当然你也可以设置环境变量指向gopm,就可随处执行了)。
gopm get -g golang.org/x/net
注意:
不采用-g参数,会把依赖包下载.vendor目录下面;
采用-g 参数,可以把依赖包下载到GOPATH目录中;
了解更多关于gopm,可以参考https://github.com/gpmgo/gopm
方法2 通过git clone下载镜像(在对应文件夹下执行)
git clone https://github.com/golang/sys.git
git clone https://github.com/golang/net.git
和go get的区别:git clone命令将repo克隆到新创建的目录中;go get下载并安装导入路径命名的包及其依赖项。
方法3 下载替换。这个方法两个字形容:难受
老老实实去github.com/golang/...
上下载对应的包然后进行替换。