【Go】go get 自動代理

qiyin發表於2019-03-22

原文連結: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_proxyhttps_proxyftp_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 協議 許可協議。轉載請註明出處!

更多原創文章乾貨分享,請關注公眾號
  • 【Go】go get 自動代理
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章