因爲一些客觀緣由的存在,咱們開發 Golang 項目的過程總會碰到沒法下載某些依賴包的問題。這不是一個小問題,由於你的工做會被打斷,即使你使用各類神通解決了問題,極可能這時你的線程已經切換到其餘的事情上了(痛恨思路被打斷!)。因此最好是一開始咱們就重視這個問題,並一勞永逸的解決它。git
當咱們使用 go get、go install、go mod 等命令時,相似於 golang.org/x/... 的包會是沒法下載的。好比經過下面的命令下載 sys 包:github
$ go get -u golang.org/x/sys
下載確定會失敗:golang
若是你有本身的代理服務器,那就很容易了,這也是一勞永逸的方法。直接設置環境變量 http_proxy 和 https_proxy 就好了:服務器
export http_proxy=http://proxyAddress:port export https_proxy=http://proxyAddress:port
好比筆者在局域網中共享了代理 192.168.21.1:1080:工具
$ export http_proxy=http://192.168.21.1:1080 $ export https_proxy=http://192.168.21.1:1080
而後執行下面的命令後就可以下載了:ui
$ go get -u golang.org/x/sys
若是一時找不到合適的代理,還能夠臨時經過手動的方式下載包。咱們常見的 golang.org/x/... 包,通常在 GitHub 上都有官方的鏡像倉庫對應。好比 zieckey/golang.org 就是做爲 golang.org/x 的鏡像庫存在的。咱們能夠手動下載或 clone 對應的 GitHub 倉庫到指定的目錄下,好比從 zieckey/golang.org 下載 x 目錄下的全部包。或者是每次只下載單個的庫,下面的示例演示如何下載 text 庫:spa
$ mkdir $GOPATH/src/golang.org/x $ cd $GOPATH/src/golang.org/x $ git clone git@github.com:golang/text.git
當若是須要指定版本的時候,該方法就無解了,由於 GitHub 上的鏡像倉庫多數都沒有 tag。線程
從 Go 1.11 版本開始,新增支持了 go modules 用於解決包依賴管理問題。該工具提供了 replace,就是爲了解決包的別名問題,也能替咱們解決 golang.org/x 沒法下載的的問題。代理
go module 被集成到原生的 go mod 命令中,可是若是你的代碼庫在 $GOPATH 中,module 功能是默認不會開啓的,想要開啓也很是簡單,經過一個環境變量便可開啓 export GO111MODULE=on。好比下面的示例,在go.mod中指定下面的代碼:code
module example.com/demo require ( golang.org/x/text v0.3.0 ) replace ( golang.org/x/text => github.com/golang/text v0.3.0 )
從 Go 1.11 版本開始,官方支持了 go module 包依賴管理工具。其實還新增了 GOPROXY 環境變量。若是設置了該變量,下載源代碼時將會經過這個環境變量設置的代理地址,而再也不是之前的直接從代碼庫下載。好比咱們能夠指定本身的代理地址。
更可喜的是,goproxy.io 這個開源項目幫咱們實現好了咱們想要的。該項目容許開發者一鍵構建本身的 GOPROXY 代理服務。同時,也提供了公用的代理服務 https://goproxy.io,咱們只需設置該環境變量便可正常下載被牆的源碼包了:
export GO111MODULE=on export GOPROXY=https://goproxy.io
也能夠經過置空這個環境變量來關閉,export GOPROXY=。
對於 Windows 用戶,能夠在 PowerShell 中設置:
$env:GOPROXY = "https://goproxy.io"
最後,咱們固然推薦使用 GOPROXY 這個環境變量的解決方式,前提是 Go version >= 1.11。
下載 golang.org/x/sys 包:
$ go get -u golang.org/x/sys
下載到的包在 $GPATH/pkg/mod/golang.org/x/