昨天 Go 1.13 終於發佈了,雖然比預期延遲了半個月之久,但畢竟遲到總比不到好。git
Go 1.13 的發佈爲 Go 帶來了很多變化(詳見:https://golang.org/doc/go1.13 ),有些變化多是開發者沒法直接感受到的,但有些又是和開發者平常開發息息相關的。其中,Go modules 的扶正就是此次 Go 1.13 發佈中開發者能直接感受到的最大變化。github
Go modules 最先發佈於 Go 1.11,通過兩個版本的更新後,它做爲依賴管理解決方案來講如今已經變得光彩奪目。隨着 Go modules 一塊兒被髮布的還有一個叫作 Module proxy protocol
的協議,經過它咱們能夠搭建 Go 模塊代理,最後交由 GOPROXY
環境變量以指引 go 命令後續在抓取模塊時的途徑。
對於我們中國的開發者來講,一個優秀的 Go 模塊代理能夠幫助咱們解決不少問題。好比 Go 語言中最知名的 golang.org/x/...
模塊在中國大陸是沒法訪問到的,之前咱們會用不少其餘的辦法來抓取他們,而若依靠一個能夠訪問到它們的模塊代理,那麼將事半功倍。golang
更由於 Go 1.13 將 GOPROXY
默認成了中國大陸沒法訪問的 https://proxy.golang.org ,因此咱們中國的開發者從今之後必須先修改 GOPROXY
才能正常使用 go 來開發應用了。爲此,咱們聯合中國備受信賴的雲服務提供商七牛雲專門爲我們中國開發者而打造了一個 Go 模塊代理:goproxy.cn
。數據庫
goproxy.cn
是目前中國最可靠的 Go 模塊代理,這個若是有人存在質疑能夠一一測試比對列表中全部能在國內訪問的代理。對於那個和 goproxy.cn
域名比較相近的 goproxy.io
,我以前已經發表過一篇實測文章(詳見:https://studygolang.com/topic... )。網絡
goproxy.cn
仍是是一個非營利性項目,目標是爲中國和世界上其餘地方的 Gopher 們提供一個免費的、可靠的、持續在線的且通過 CDN 加速的模塊代理。正由於 goproxy.cn
由中國 Go 語言第一個吃螃蟹的大公司七牛雲運行,因此它的穩定性和運行速度都是毋庸置疑的,若是你的網絡環境自己不差的狀況下,它能快到讓你難以想象,比 go get
傳統的抓取方式快上了不止幾倍。測試
有人可能會問阿里雲的也很快,並且阿里雲也是大廠,爲何不用阿里雲的模塊代理(mirrors.aliyun.com/goproxy)。我只能說,當我在使用阿里雲的代理作初始化 github.com/kubernetes/kubernetes
的測試時,出現了大量的 404 錯誤以致於初始化操做沒法完成……並且它還不支持代理 GOSUMDB
的默認值也就是 sum.golang.org
,所以你還得手動修改 GOSUMDB
纔可以正常使用 go
。在速度旗鼓至關的狀況下,爲何不考慮直接使用一個更穩定、高可用的呢?並且畢竟 goproxy.cn
這個域名也很好記不是嘛~你只用記住 goproxy
和 .cn
,就沒了。網站
答:一條 go env -w GOPROXY=https://goproxy.cn,direct
便可。之因此在後面拼接一個 ,direct
,是由於經過這樣作咱們能夠在必定程度上解決私有庫的問題(固然, goproxy.cn 沒法訪問你的私有庫)。這個 GOPROXY
設定的工做原理是:當 go
在抓取目標模塊時,若碰見了 404 錯誤,那麼就回退到 direct
也就是直接去目標模塊的源頭(好比 GitHub) 去抓取。而剛好,GitHub 等相似的代碼託管網站的原則基本都是「你無權訪問的你來講就是不存在的」,因此我才說經過這樣設定能夠在必定程度上解決私有庫沒法經過模塊代理訪問的問題。阿里雲
答:一樣也是設置環境變量便可,可是得你手動配置,並且還不能使用上述的那個 ,direct
後綴,由於那是 Go 1.13 剛加的特性。詳細配置方法能夠參見 goproxy.cn 的 README 文件。spa
答:在上述的回答中我有提到能夠經過 Go 1.13 爲 GOPROXY
新增的「代理列表」特性來爲 goproxy.cn 作一個 fallback 選項,也就是 direct
(直接從目標模塊源頭抓取),它就是解決私有庫的一種途徑,但並非一個完美的解決方案。爲此,Go 1.13 還推出了一個 GONOPROXY
環境變量(詳見: https://golang.org/cmd/go/#hdr-Environment_variables ),經過設置它咱們能夠實現控制讓哪些 module path 忽略 GOPROXY
,無腦回源。好比 GONOPROXY=*.corp.example.com
就意味着 go
在抓取全部 corp.example.com
的三級子域名下的全部模塊時都將忽略 GOPROXY
設置直接回源到目標模塊的原地址。3d
答:Go 1.13 新推出了一個 GOSUMDB
(默認值是 sum.golang.org ,國內沒法訪問),就是爲了實現這個目的,它的值是一個可信任的模塊校驗和數據庫地址,經過指定它,go
將在抓取完模塊時(不管是不是通過模塊代理抓取的)對全部模塊進行哈希校驗,只有和校驗和數據庫中現有的一致時纔算抓取成功。同 GONOPROXY
同樣,Go 1.13 也爲 GOSUMDB
配對發佈了一個 GONOSUMDB
,用法一致,做用是控制 go
應該忽略校驗哪些 module path 下的模塊。
GONOPROXY
和 GONOSUMDB
很麻煩,有沒有更好的辦法?答:有,Go 1.13 爲了方便管理私有庫規則,還推出了一個 GOPRIVATE
,能夠簡單地理解成經過設置它就同時設置了 GONOPROXY
和 GONOSUMDB
。
原文做者:@盛傲飛,已取得受權。