【Go】go get 自動代理
原文連結:https://blog.thinkeridea.com/201903/go/go_get_proxy.html
最近發現技術交流群裡很多人在詢問 go get 牆外包失敗的問題,大家給了很多解決方案:
- 從 Github 的程式碼庫 clone
- 設定 GOPROXY 環境變數配置代理, 例如:GOPROXY=https://goproxy.io
- 配置命令列代理,https_proxy 環境變數
- 使用 go mod replace
- 使用 Gopm 類似的工具
- ……
Go 的社群很活躍,國內 gopher 對 Go 的熱情不會因為牆的存在而減少,從社群想到這麼多翻牆方案就能看出來了。
上面的方法都是可行的,但是總有一些不盡人意,社群也一直在找更好的方法,我一直使用自動代理的方式獲取牆外的包,可以支援所有 Go 原生拉取包操作,比如 go get、go mod、dep、godep、glide 等各種方法,只需要配置一次,只要在任何原生命令前加字首執行命令即可,效率很高。
<!--more-->
實戰操作
工具類就先不講原理,想直接獲取方法的同學看這一部分即可,想了解原理的同學可以看後面的原理部分。
你需要準備如下工具:
- 一個 http 代理
- Git
- Github 賬號設定好 ssh
- 其它 git 相關服務設定好 ssh (例如自建 gitlab)
- 一個可以執行 shell 的環境 (linux、Mac、windows 可以使用 git bash)
具體步驟
- 首先通過 git 設定需要不代理的網站,以 Github 為例,執行
git config --global url.git@github.com:.insteadof https://github.com/
從 https 轉到 ssh 協議,這樣會使我們設定的 https 代理不作用在 ssh 協議上,如果有自建的服務只要更換地址就可以了。 -
新建一個指令碼 (proxy),修改裡面的代理地址為自己的代理地址,如下:
#!/usr/bin/env bash # 如果你的系統沒有bash,或者沒有 /usr/bin/env ,請修改上一行指令為你的環境 export http_proxy=http://127.0.0.1:1087 # 代理地址需要換成自己的 export https_proxy=http://127.0.0.1:1087 export ftp_proxy=http://127.0.0.1:1087 exec ${@:1}
- 給 shell 指令碼設定可執行許可權,然後放到 path 環境變數路徑下。
- 測試
proxy curl https://www.google.com
和curl https://www.google.com
第一個命令可以獲取到結果,第二個命令不可以。 - 測試
proxy go get -v golang.org/x/text/…
可以正常下載包,其它任何拉取包命令都可以新增proxy
字首執行 ,比如proxy dep ensure -v
截止當前你就配置了一個 go get
自動代理的環境,以後需要翻牆操作的指令執行時加 proxy
就可以了,該方法並不只適用於 go get
,任何需要命令列代理都可以使用。
原理篇
實際原理簡單,找到這種方法也是一種巧合,在入坑 Go 之前我經常用 linux,當時有一些需求需要命令列翻牆,找到了三個環境變數 http_proxy
、https_proxy
、ftp_proxy
,但是全域性設定導致很多請求變慢,如果在一個視窗臨時設定就導致需要記住那個視窗設定了代理,切換視窗成本也比較高,後來根據 shell 的特性,任何一個指令碼都有自己獨立的環境變數,所以用一個指令碼設定代理環境變數,exec ${@:1}
可以執行指令碼後面的指令,也就是我們實際需要執行的指令,這樣在需要代理的命令前就加上這個指令碼字首就好了,單行命令代理就這麼簡單的配置好了。
前期我使用 go 的時候遇到下載不了的包時,就會在 go get
前加上 proxy
指令,但是我發現拉取 Github 包的效率非常低,本身國內現在訪問 Github 已經很快了。也是一個巧合,當時我公司 Go 專案遷移到 Github 上,所有專案全部是私有專案,有同事提供了一個 git https 轉 ssh 協議的操作,git config --global url.git@….:.insteadof https://…./
,這個操作讓我看到一個隱性福利,之前的代理只會代理 https 並不能代理 ssh 協議,那麼使用這個指令把不需要代理的網站全部轉成 ssh 協議,然後加上 proxy
執行 go get
就成了自動代理了,嘗試之後確實效率很高,至此一直使用到今天。
轉載:
本文作者: 戚銀(thinkeridea)
本文連結: https://blog.thinkeridea.com/201903/go/go_get_proxy.html
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY 4.0 CN 協議 許可協議。轉載請註明出處!
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Go | Go 結合 Consul 實現動態反向代理Go
- go get 超時Go
- 解決問題: go get certificate signed by unknown authority 換個代理或者Go
- go get 無法下載Go
- go mod: 配置代理Go
- Go 1.16 中關於 go get 和 go install 你需要注意的地方Go
- go get報錯connect: connection refusedGo
- go get時出現‘xxx is deprecated’Go
- go get 安裝gitlab私有包GoGitlab
- go語言go get 匯入官方依賴的解決方法Go
- go get 安裝 go.etcd.io etcd clientv3 報錯Goclient
- Go 解決國內go get安裝包超時問題Go
- go對get、post請求封裝Go封裝
- 解決 go get 超時問題Go
- go proxy 實現反向代理Go
- Go Gin安裝解決國內go get 方式安裝超時Go
- go 的自動過載工具安裝Go
- go get 拉取擴充套件報錯Go套件
- golang go get速度慢解決方法Golang
- GO get 安裝特別慢的問題以及 goland 載入 go moduleGoLand
- go 代理穩定不卡頓Go
- Go Quiz: 從Go面試題看數值型別的自動推導GoUI面試題型別
- GO 使用Webhook 實現github 自動化部署GoWebHookGithub
- Go HTTP GET 請求可以傳送 body 嗎GoHTTP
- go get 安裝 第三方包Go
- Go使用net/http庫傳送GET請求GoHTTP
- 國內的 go get 問題的解決 --gopmGo
- go get下載包失敗的解決方案Go
- Go 解決國內下載 go get golang.org/x 包失敗 非原創Golang
- 解決 go get github.com/kotakanbe/go-cve-dictionary下載中遇到的問題GoGithub
- 統計Go, Go, GoGo
- 使用go-swagger為golang API自動生成swagger文件SwaggerGolangAPI
- Go 實現常用設計模式(九)代理模式Go設計模式
- Go Wednesday活動提案Go
- 有Go好用的自動化測試框架推薦嗎?Go框架
- Robotgo v0.50.0 釋出了, Go 桌面自動化, 巨大更新OTGGo
- 使用go語言開發自動化API測試工具GoAPI
- Robotgo v0.49.0 釋出了, Go 桌面自動化, 更多特性OTGGo