如何在长城后面go get一些库

国内的Go开发已然蔚然成风,但是Go开发者比较痛苦的是,golang.org网站以及其它的一些相关的开发网站被GFW屏蔽了。下载Go开发包海容易些,国内有一些镜像站点,或者通过一些代理也能访问,但是下载一些开发库的时候,这些库可能直接或者间接引用了 `golang.org/x/...`等依赖库, 通过go get命令确没有办法下载下来。

我原先在Comcast,这是一家外企,在国内有vpn可以直接访问这些网站,所以以前没有觉得go get是一个问题,看到大家被GFW弄的焦头烂额的时候也没觉得是一件大事情,现在换到国内的互联网企业,切切实实的感觉到GFW的威力。首先是google.com, golang.org等网站被屏蔽掉了,其次 go get 一些库如golangorg/x/net失败。

总得想些办法吧。如果有自己的VPN的话,应该比较好的解决,我没有,不过我比较熟悉的是shadowsocks,所以基于shadowsocks想了一些办法,总算能正常的下载了,本文纪录一下这曲折的过程。

shadowsocks的安装和使用我就不说了,请自行搜索。Shadowsocks虽然能访问一些屏蔽的站点比如golang.org,但是它基于socks5协议,对于go get来说,依然不可用。

下一步就是想办法将socks5代理转为http代理了。

一个方法如 mac下宿主机和docker内go get代理设置一文中介绍的privoxy,不过我没有试成功。

另一个方法是实用 cow, 这是shadowsocks-go作者的另一个开发项目,根据项目介绍很容易的配置,可以在本机启动一个http代理,以shadowsocks为二级代理。

1
2
listen = http://127.0.0.1:7777
proxy = socks5://127.0.0.1:1080

然后设置环境变量,就可以go get被屏蔽的库了。

1
2
export http_proxy=http://127.0.0.1:7777
export https_proxy=http://127.0.0.1:7777

如果没有代理,而你又需要golang.org/x/...的包,你可以手工在你的GOPATH下创建这些目录,然后 git clone github.com/golang/xxx相应的目录即可(xxx替换成泥需要的库,比如net)。