前言:
隨着 go1.11 的發布,go 官方引入了 go module 來解決依賴管理問題,go module 被集成到原生的 go cmd 中,但是如果你的代碼庫在$GOPATH中,go1.11 的 module 功能是默認不會開啟的,想要開啟也非常簡單, 通過一個環境變量即可開啟go module:export GO111MODULE=on
。
關於 $GOPROXY
當我們使用go的時候,go默認會直接從代碼庫中去下載所需的相關依賴,GOPROXY 這個環境變量可以讓我們控制自己從哪里去下載源代碼,如果 GOPROXY 沒有設置,go 會直接從代碼庫下載相關依賴代碼。如果你像下面這樣設置了這個環境變量,那么你就會通過 goproxy.io 下載所有的源代碼。
export GOPROXY=https://goproxy.io
你可以通過置空這個環境變量來關閉,export GOPROXY= 。
以前大家執行 go get golang.org/x/net
net代碼庫會下載到本地GOPATH中,以后有任何項目引用到了 golang.org/x/net
都不會再去下載這個代碼庫,因為本地GOPATH已經有了,哪怕版本不對,golang也會引用。但是隨着 module 概念引入go語言,每個引入的 module 擁有了 version。隨着代碼庫的不斷更新迭代,大家即使是對同一個代碼庫的引用也可能用了不同的tag 或者 commit hash,基於這個現狀,go1.11 的 module 會比以前更頻繁的下載源代碼。但是基於中國有中國特色的互聯網,我們有時候很難get到我們需要的依賴源代碼,進而導致項目編譯失敗,CI失敗。於是,我們需要一個proxy。
goproxy.io
goproxy.io 是一個開源項目,當用戶請求一個依賴庫時,如果它發現本地沒有這份代碼就會自動請求源,然后cache到本地,用戶就可以從 goproxy.io 請求到數據。當然,這些都是在一個請求中完成的。goproxy.io 只支持 go module 模式。當用戶執行 go get 命令時,會去檢查$GOPROXY//@v/list這個文件中是否有用戶想要獲取的版本,如果有,就依次獲取 $GOPROXY//@v/.info、$GOPROXY//@v/.mod、$GOPROXY//@v/.zip 等文件,如果沒有就直接從源碼庫中去下載。
得益於 go module 在設計的時候非常重視安全這個領域,所以在啟用了 go module 后,你會發現除了 go.mod
這個文件之外,還有一個 go.sum
文件,這個文件保存了每個依賴庫的對應的hash值,來保證下載回來的代碼庫是正確的,不被人篡改的。同時, goproxy.io 也是個開源的項目。可以自行部署到自己的IDC中,因為公司內部自己的代碼庫 goproxy.io 是無法訪問到的。開源地址:
https://github.com/goproxyio/goproxy
References:
https://goproxy.io
https://github.com/goproxyio/goproxy
https://research.swtch.com/vgo-intro
https://docs.gomods.io