昨天 Go 1.13 終于發(fā)布了,雖然比預期延遲了半個月之久剖张,但畢竟遲到總比不到好。
Go 1.13 的發(fā)布為 Go 帶來了不少變化(詳見:https://golang.org/doc/go1.13 )搔弄,有些變化可能是開發(fā)者無法直接感覺到的顾犹,但有些又是和開發(fā)者日常開發(fā)息息相關的。其中炫刷,Go modules 的扶正就是這次 Go 1.13 發(fā)布中開發(fā)者能直接感覺到的最大變化。
Go modules 最早發(fā)布于 Go 1.11绍申,經過兩個版本的更新后锄奢,它作為依賴管理解決方案來說現(xiàn)在已經變得光彩奪目。隨著 Go modules 一起被發(fā)布的還有一個叫做 Module proxy protocol
的協(xié)議涂屁,通過它我們可以搭建 Go 模塊代理灰伟,最后交由 GOPROXY
環(huán)境變量以指引 go 命令后續(xù)在抓取模塊時的途徑。
對于咱們中國的開發(fā)者來說帖族,一個優(yōu)秀的 Go 模塊代理可以幫助我們解決很多問題挡爵。比如 Go 語言中最知名的 golang.org/x/...
模塊在中國大陸是無法訪問到的,以前我們會用很多其他的辦法來抓取他們涣雕,而若依靠一個可以訪問到它們的模塊代理闭翩,那么將事半功倍。
更因為 Go 1.13 將 GOPROXY
默認成了中國大陸無法訪問的 https://proxy.golang.org 兑障,所以我們中國的開發(fā)者從今以后必須先修改 GOPROXY
才能正常使用 go 來開發(fā)應用了。為此流译,我們聯(lián)合中國備受信賴的云服務提供商七牛云專門為咱們中國開發(fā)者而打造了一個 Go 模塊代理:goproxy.cn
先蒋。
什么是 goproxy.cn宛渐?
goproxy.cn
是目前中國最可靠的 Go 模塊代理,這個如果有人存在質疑可以一一測試比對列表中所有能在國內訪問的代理窥翩。對于那個和 goproxy.cn
域名比較相近的 goproxy.io
,我之前已經發(fā)表過一篇實測文章(詳見:https://studygolang.com/topic... )寇蚊。
goproxy.cn
還是是一個非營利性項目仗岸,目標是為中國和世界上其他地方的 Gopher 們提供一個免費的、可靠的扒怖、持續(xù)在線的且經過 CDN 加速的模塊代理。正因為 goproxy.cn
由中國 Go 語言第一個吃螃蟹的大公司七牛云運行蚂蕴,所以它的穩(wěn)定性和運行速度都是毋庸置疑的俯邓,如果你的網絡環(huán)境本身不差的情況下,它能快到讓你不可思議鸟整,比 go get
傳統(tǒng)的抓取方式快上了不止幾倍朦蕴。
有人可能會問阿里云的也很快,而且阿里云也是大廠兑燥,為什么不用阿里云的模塊代理(mirrors.aliyun.com/goproxy)琴拧。我只能說,當我在使用阿里云的代理做初始化 github.com/kubernetes/kubernetes
的測試時挣饥,出現(xiàn)了大量的 404 錯誤以至于初始化操作無法完成……而且它還不支持代理 GOSUMDB
的默認值也就是 sum.golang.org
,因此你還得手動修改 GOSUMDB
才能夠正常使用 go
汛聚。在速度旗鼓相當的情況下短荐,為什么不考慮直接使用一個更穩(wěn)定、高可用的呢痕貌?而且畢竟 goproxy.cn
這個域名也很好記不是嘛~你只用記住 goproxy
和 .cn
糠排,就沒了。
Q&A
問:在 Go 1.13 中如何使用 goproxy.cn哺徊?
答:一條 go env -w GOPROXY=https://goproxy.cn,direct
即可乾闰。之所以在后面拼接一個 ,direct
,是因為通過這樣做我們可以在一定程度上解決私有庫的問題(當然淋硝, goproxy.cn 無法訪問你的私有庫)宽菜。這個 GOPROXY
設定的工作原理是:當 go
在抓取目標模塊時,若遇見了 404 錯誤继谚,那么就回退到 direct
也就是直接去目標模塊的源頭(比如 GitHub) 去抓取阵幸。而恰好,GitHub 等類似的代碼托管網站的原則基本都是“你無權訪問的你來說就是不存在的”诡壁,所以我才說通過這樣設定可以在一定程度上解決私有庫無法通過模塊代理訪問的問題荠割。
問:在 Go 1.13 之前如何使用 goproxy.cn旺矾?
答:同樣也是設置環(huán)境變量即可夺克,但是得你手動配置,而且還不能使用上述的那個 ,direct
后綴柬帕,因為那是 Go 1.13 剛加的特性狡门。詳細配置方法可以參見 goproxy.cn 的 README 文件。
問:在 Go 1.13 中如何解決私有庫問題盼铁?
答:在上述的回答中我有提到可以通過 Go 1.13 為 GOPROXY
新增的“代理列表”特性來為goproxy.cn 做一個 fallback 選項尝偎,也就是 direct
(直接從目標模塊源頭抓扰艨亍)当辐,它就是解決私有庫的一種途徑,但并不是一個完美的解決方案缘揪。為此找筝,Go 1.13 還推出了一個 GONOPROXY
環(huán)境變量(詳見: https://golang.org/cmd/go/#hdr-Environment_variables ),通過設置它我們可以實現(xiàn)控制讓哪些 module path 忽略 GOPROXY
曹抬,無腦回源急鳄。比如 GONOPROXY=*.corp.example.com
就意味著 go
在抓取所有 corp.example.com
的三級子域名下的所有模塊時都將忽略 GOPROXY
設置直接回源到目標模塊的原地址。
問:在 Go 1.13 中如何防止從公共模塊代理中抓取的模塊被篡改疾宏?
答:Go 1.13 新推出了一個 GOSUMDB
(默認值是 sum.golang.org 坎藐,國內無法訪問),就是為了實現(xiàn)這個目的,它的值是一個可信任的模塊校驗和數據庫地址凌那,通過指定它吟逝,go
將在抓取完模塊時(無論是否是經過模塊代理抓取的)對所有模塊進行哈希校驗块攒,只有和校驗和數據庫中現(xiàn)有的一致時才算抓取成功。同 GONOPROXY
一樣囱井,Go 1.13 也為 GOSUMDB
配對發(fā)布了一個 GONOSUMDB
庞呕,用法一致,作用是控制 go
應該忽略校驗哪些 module path 下的模塊住练。
問:分別設置 GONOPROXY
和 GONOSUMDB
很麻煩,有沒有更好的辦法讲逛?
答:有亏吝,Go 1.13 為了方便管理私有庫規(guī)則,還推出了一個 GOPRIVATE
盏混,可以簡單地理解成通過設置它就同時設置了 GONOPROXY
和 GONOSUMDB
蔚鸥。