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/...上下載對應的包然後進行替換。

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