前言:
隨著 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: