令 Golang 開發者最痛苦事情之一便是在國內無法直接使用go get
命令更新 golang.org 以及 gopkg.in 的 package。目前,大家使用 socks5 比較多,但是如果不進行設置, go get
是無法與 socks5 配合工作的。本文簡述一種基本的方法。
0x01 大致瞭解下原理
本質上來講,go get
命令所做的動作也被叫做代碼包遠程導入。go get
命令可以從任何命令支持的代碼版本控制系統(Version Control System,簡稱爲VCS)檢出代碼包。
而其所支持的 VCS 的信息如下:
- Mercurial(hg)
- Git(git)
- Subversion(svn)
- Bazaar(bzr)
因此,go get
在代碼包導入時,首先會判斷該遠程包使用什麼 VCS 進行管理,再使用對應的源碼工具進行導入。
例如,當我們需要執行go get golang.org/x/crypto
時,大致上會分爲兩步執行:
- 先訪問 https://golang.org/x/crypto?go-get=1 來獲取 VCS 的類型,得到答案是Git
- 再通過具體的 VCS 的源碼工具命令
git clone https://golang.org/x/crypto
進行代碼包遠程導入
因此,我們要同時解決上述兩步的問題,才能讓 go get
基於 socks5 進行代碼包遠程導入。
0x02 解決命令行 http/https 訪問的方法
set http_proxy=socks5://127.0.0.1:1080
set https_proxy=socks5://127.0.0.1:1080
注:1080 端口爲 ShadowSocks 默認端口
0x03 解決VCS 的源碼工具訪問的方法
根據 Golang 官方 Wiki 提供的方法的先配置源碼工具的代理問題,如 Git 的配置爲:
$ git config [--global] http.proxy http://proxy.example.com:port
其他 VCS 的配置方法詳見:https://github.com/golang/go/wiki/GoGetProxyConfig
0x04 最終的解決方案
上述兩步其實有冗餘,經過整合,最終方案如下:
set http_proxy=socks5://127.0.0.1:1080
set https_proxy=socks5://127.0.0.1:1080
go get -u -v your.package.name
注:1080 端口爲 socks5 默認端口