Go的包管理工具(四):Go Module Proxy

aoho發表於2019-03-19

在前面的文章,我們介紹了Go Modules。Go module支援了Versioned Go,並初步解決了包依賴管理的問題。

新的工作模式也帶來了一些問題,在大陸地區我們無法直接通過 go get 命令獲取到一些第三方包,最常見的就是 golang.org/x 下面的各種優秀的包。一旦工作在模組下,go build 將不再關心 GOPATH 或是 vendor 下的包,而是到 GOPATH/pkg/mod 查詢是否有cache,如果沒有,則會去下載某個版本的 module,而對於某些包的 module,在大陸地區往往會失敗。本文將重點介紹 go module 的 proxy 配置實現,包括如下兩種的代理配置:

  • GOPROXY
  • Athens

GOPROXY

goproxy 是一個開源專案,當使用者請求一個依賴庫時,如果它發現本地沒有這份程式碼就會自動請求源,然後快取到本地,使用者就可以從 goproxy.io 請求到資料。當然,這些都是在一個請求中完成的。goproxy.io 只支援 go module 模式。當使用者執行 go get 命令時,會去檢查 $GOPROXY//@v/list 這個檔案中是否有使用者想要獲取的版本,如果有,就依次獲取 $GOPROXY//@v/.info$GOPROXY//@v/.mod$GOPROXY//@v/.zip 等檔案,如果沒有就直接從原始碼庫中去下載。

通過命令:

export GOPROXY=https://goproxy.io
複製程式碼

設定了這個環境變數,一旦設定生效,後續 go 命令會通過 go module download protocolproxy 互動下載特定版本的 module。當然,我們還可以置空 GOPROXY 變數,來關閉 GOPROXY 代理。

詳見: github.com/goproxyio/g…

Athens

Go的包管理工具(四):Go Module Proxy
Athens 是一個建立在 vgo(或者是1.11 +)之上的專案,試圖讓依賴關係更接近你,即使在 VCS 關閉時你也可以依賴可重複的構建。

依賴關係是來自 Github 的不可變的程式碼塊和相關的後設資料。 他們儲存在 Athens 控制的倉庫裡。

您可能已經知道“不可變”意味著什麼,但讓我再次指出它,因為它對整個系統非常重要。當人們改變他們的包,迭代,實驗或其他任何東西時,Athens 的程式碼都不會改變。如果軟體包作者釋出了一個新版本,Athens 將把它拉下來。比如某個專案依賴於包 M 版 v1.2.3,它將永遠不會改變 Athens 上的包。

安裝

Athens 支援多種方式的安裝,docker 容器、k8s 和二進位制安裝包,本文將會介紹如何通過二進位制包安裝。

git clone https://github.com/gomods/athens
cd athens
make build-ver VERSION="0.2.0"
複製程式碼
 ./athens -version
複製程式碼

獲取私有倉庫

Athens 獲取私有倉庫中的 module,這也是一個企業級的需求。通常企業私有倉庫都是需要身份驗證的,因此我們需要在 Athens 中配置訪問私有倉庫的賬號和憑證資訊。目前 Athens 官方文件中提供了通過 .netrc 方式訪問帶有身份驗證的私有倉庫的功能。

通過建立 .netrc 檔案,進行私有倉庫身份驗證。

//.netrc

machine github.com
  login MY_USERNAME
  password MY_PASSWORD
複製程式碼

本地應用

export GO111MODULE=on
export GOPROXY=http://127.0.0.1:3000
複製程式碼

我們可以使用 Athens 提供的 walkthrough

git clone https://github.com/athens-artifacts/walkthrough.git
複製程式碼
$ cd ../walkthrough
$ go run .
go: finding github.com/athens-artifacts/samplelib v1.0.0
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.info [200]
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.mod [200]
go: downloading github.com/athens-artifacts/samplelib v1.0.0
handler: GET /github.com/athens-artifacts/samplelib/@v/v1.0.0.zip [200]
The ? says rawr!
複製程式碼

go run . 的輸出包括嘗試查詢 github.com/athens-artifacts/samplelib 依賴項。由於代理是在後臺執行的,因此還可以看到來自 Athens 的輸出,表明它正在處理對依賴項的請求。

global public proxy

Athens 還提供了一個試驗性的 proxy:athens.azurefd.net 供全球gopher 使用。匯入環境變數:

export GOPROXY="https://athens.azurefd.net"
複製程式碼

當然雖然可以使用這些公有的代理,但是包的源並不是很全,最穩妥的方法還是自建 Athens 服務。官方issue中所說:

athens.azurefd.net 處於 alpha 的版本,目前基礎設施還沒有很好地維護,所以看到超時並不感到驚訝。自建 Athens 或使用 GoCenter(目前唯一的託管Go模組儲存庫)。

推薦閱讀

Go的包管理工具

訂閱最新文章,歡迎關注我的公眾號

微信公眾號

參考

  1. Athens docs
  2. 再探go modules:使用與細節

相關文章