golang爬坑笔记之自问自答系列(9)——go get被墙的问题

在编写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/...上下载对应的包然后进行替换。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章