解決 go get 下載安裝 golang.org/x 相關包失敗的問題

問題描述

當我們使用 go getgo installgo mod 等命令時,會自動下載相應的包或依賴包。但由於衆所周知的原因,類似於 golang.org/x/... 的包會出現下載失敗的情況。如下所示:

$ go get -u golang.org/x/sys

go get golang.org/x/sys: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解決方式

那我們該如何解決問題呢?畢竟還要製造 bug 的嘛~

手動下載

我們常見的 golang.org/x/... 包,一般在 GitHub 上都有官方的鏡像倉庫對應。比如 golang.org/x/text 對應 github.com/golang/text。所以,我們可以手動下載或 clone 對應的 GitHub 倉庫到指定的目錄下。

mkdir $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone [email protected]:golang/text.git
rm -rf text/.git

當如果需要指定版本的時候,該方法就無解了,因爲 GitHub 上的鏡像倉庫多數都沒有 tag。並且,手動嘛,程序員怎麼能幹呢,尤其是依賴的依賴,太多了。

設置代理

如果你有代理,那麼可以設置對應的環境變量:

export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port

或者,直接用 all_proxy

export all_proxy=http://proxyAddress:port

go mod replace

從 Go 1.11 版本開始,新增支持了 go modules 用於解決包依賴管理問題。該工具提供了 replace,就是爲了解決包的別名問題,也能替我們解決 golang.org/x 無法下載的的問題。

go module 被集成到原生的 go mod 命令中,但是如果你的代碼庫在 $GOPATH 中,module 功能是默認不會開啓的,想要開啓也非常簡單,通過一個環境變量即可開啓 export GO111MODULE=on

以下爲參考示例:

module example.com/hello

require (
    golang.org/x/text v0.3.0
)

replace (
    golang.org/x/text => github.com/golang/text v0.3.0
)

類似的還有 glidegopm 等這類第三方包管理工具,都不同方式的解決方案提供給我們。

GOPROXY 環境變量

終於到了本文的終極大殺器 —— GOPROXY

我們知道從 Go 1.11 版本開始,官方支持了 go module 包依賴管理工具。

其實還新增了 GOPROXY 環境變量。如果設置了該變量,下載源代碼時將會通過這個環境變量設置的代理地址,而不再是以前的直接從代碼庫下載。這無疑對我等無法科學上網的開發良民來說是最大的福音。

更可喜的是,goproxy.io 這個開源項目幫我們實現好了我們想要的。該項目允許開發者一鍵構建自己的 GOPROXY 代理服務。同時,也提供了公用的代理服務 https://goproxy.io,我們只需設置該環境變量即可正常下載被牆的源碼包了:

export GOPROXY=https://goproxy.io

也可以通過置空這個環境變量來關閉,export GOPROXY=

對於 Windows 用戶,可以在 PowerShell 中設置:

$env:GOPROXY = "https://goproxy.io"

最後,我們當然推薦使用 GOPROXY 這個環境變量的解決方式,前提是 Go version >= 1.11

參考資料

感謝您的閱讀,覺得內容不錯,點個贊吧 😆

原文地址: https://shockerli.net/post/go...

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