在前面的文章,咱們介紹了Go Modules
。Go module支持了Versioned Go,並初步解決了包依賴管理的問題。html
新的工做模式也帶來了一些問題,在大陸地區咱們沒法直接經過 go get
命令獲取到一些第三方包,最多見的就是 golang.org/x
下面的各類優秀的包。一旦工做在模塊下,go build
將再也不關心 GOPATH 或是 vendor 下的包,而是到 GOPATH/pkg/mod
查詢是否有cache,若是沒有,則會去下載某個版本的 module,而對於某些包的 module,在大陸地區每每會失敗。本文將重點介紹 go module 的 proxy 配置實現,包括以下兩種的代理配置:git
goproxy 是一個開源項目,當用戶請求一個依賴庫時,若是它發現本地沒有這份代碼就會自動請求源,而後緩存到本地,用戶就能夠從 goproxy.io 請求到數據。固然,這些都是在一個請求中完成的。goproxy.io 只支持 go module 模式。當用戶執行 go get 命令時,會去檢查 $GOPROXY//@v/list
這個文件中是否有用戶想要獲取的版本,若是有,就依次獲取 $GOPROXY//@v/.info
、$GOPROXY//@v/.mod
、$GOPROXY//@v/.zip
等文件,若是沒有就直接從源碼庫中去下載。github
經過命令:golang
export GOPROXY=https://goproxy.io
複製代碼
設置了這個環境變量,一旦設置生效,後續 go 命令會經過 go module download protocol
與 proxy
交互下載特定版本的 module
。固然,咱們還能夠置空 GOPROXY
變量,來關閉 GOPROXY
代理。docker
詳見: github.com/goproxyio/g…緩存
依賴關係是來自 Github 的不可變的代碼塊和相關的元數據。 他們存儲在 Athens 控制的倉庫裏。bash
您可能已經知道「不可變」意味着什麼,但讓我再次指出它,由於它對整個系統很是重要。當人們改變他們的包,迭代,實驗或其餘任何東西時,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
方式訪問帶有身份驗證的私有倉庫的功能。ui
經過建立 .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 的輸出,代表它正在處理對依賴項的請求。
Athens 還提供了一個試驗性的 proxy:athens.azurefd.net
供全球gopher 使用。導入環境變量:
export GOPROXY="https://athens.azurefd.net"
複製代碼
固然雖然能夠使用這些公有的代理,可是包的源並非很全,最穩妥的方法仍是自建 Athens 服務。官方issue中所說:
athens.azurefd.net
處於 alpha 的版本,目前基礎設施尚未很好地維護,因此看到超時並不感到驚訝。自建Athens
或使用 GoCenter(目前惟一的託管Go模塊存儲庫)。