go get 獲取被墻依賴包解決方法
前言:
隨著 go1.11 的發(fā)布,go 官方引入了 go module 來解決依賴管理問題,go module 被集成到原生的 go cmd 中,但是如果你的代碼庫在$GOPATH中,go1.11 的 module 功能是默認(rèn)不會開啟的,想要開啟也非常簡單, 通過一個環(huán)境變量即可開啟go module:export GO111MODULE=on。
關(guān)于 $GOPROXY
當(dāng)我們使用go的時候,go默認(rèn)會直接從代碼庫中去下載所需的相關(guān)依賴,GOPROXY 這個環(huán)境變量可以讓我們控制自己從哪里去下載源代碼,如果 GOPROXY 沒有設(shè)置,go 會直接從代碼庫下載相關(guān)依賴代碼。如果你像下面這樣設(shè)置了這個環(huán)境變量,那么你就會通過 goproxy.io 下載所有的源代碼。
export GOPROXY=https://goproxy.io
你可以通過置空這個環(huán)境變量來關(guān)閉,export GOPROXY= 。
以前大家執(zhí)行 go get golang.org/x/net net代碼庫會下載到本地GOPATH中,以后有任何項目引用到了 golang.org/x/net 都不會再去下載這個代碼庫,因為本地GOPATH已經(jīng)有了,哪怕版本不對,golang也會引用。但是隨著 module 概念引入go語言,每個引入的 module 擁有了 version。隨著代碼庫的不斷更新迭代,大家即使是對同一個代碼庫的引用也可能用了不同的tag 或者 commit hash,基于這個現(xiàn)狀,go1.11 的 module 會比以前更頻繁的下載源代碼。但是基于中國有中國特色的互聯(lián)網(wǎng),我們有時候很難get到我們需要的依賴源代碼,進(jìn)而導(dǎo)致項目編譯失敗,CI失敗。于是,我們需要一個proxy。
goproxy.io
goproxy.io 是一個開源項目,當(dāng)用戶請求一個依賴庫時,如果它發(fā)現(xiàn)本地沒有這份代碼就會自動請求源,然后cache到本地,用戶就可以從 goproxy.io 請求到數(shù)據(jù)。當(dāng)然,這些都是在一個請求中完成的。goproxy.io 只支持 go module 模式。當(dāng)用戶執(zhí)行 go get 命令時,會去檢查$GOPROXY//@v/list這個文件中是否有用戶想要獲取的版本,如果有,就依次獲取 $GOPROXY//@v/.info、$GOPROXY//@v/.mod、$GOPROXY//@v/.zip 等文件,如果沒有就直接從源碼庫中去下載。
得益于 go module 在設(shè)計的時候非常重視安全這個領(lǐng)域,所以在啟用了 go module 后,你會發(fā)現(xiàn)除了 go.mod 這個文件之外,還有一個 go.sum 文件,這個文件保存了每個依賴庫的對應(yīng)的hash值,來保證下載回來的代碼庫是正確的,不被人篡改的。同時, goproxy.io 也是個開源的項目。可以自行部署到自己的IDC中,因為公司內(nèi)部自己的代碼庫 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

浙公網(wǎng)安備 33010602011771號