歡迎光臨
每天分享高質量文章

goproxy.io for Go modules

前言:

隨著 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

赞(0)

分享創造快樂