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

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)

分享創造快樂