【Go】go get 自動代理

原文連接:https://blog.thinkeridea.com/201903/go/go_get_proxy.htmlhtml

最近發現技術交流羣裏不少人在詢問 go get 牆外包失敗的問題,你們給了不少解決方案:linux

  • 從 Github 的代碼庫 clone
  • 設置 GOPROXY 環境變量配置代理, 例如:GOPROXY=https://goproxy.io
  • 配置命令行代理,https_proxy 環境變量
  • 使用 go mod replace
  • 使用 Gopm 相似的工具
  • ……

Go 的社區很活躍,國內 gopher 對 Go 的熱情不會由於牆的存在而減小,從社區想到這麼多FQ方案就能看出來了。git

上面的方法都是可行的,可是總有一些不盡人意,社區也一直在找更好的方法,我一直使用自動代理的方式獲取牆外的包,能夠支持全部 Go 原生拉取包操做,好比 go get、go mod、dep、godep、glide 等各類方法,只須要配置一次,只要在任何原生命令前加前綴運行命令便可,效率很高。github

實戰操做

工具類就先不講原理,想直接獲取方法的同窗看這一部分便可,想了解原理的同窗能夠看後面的原理部分golang

你須要準備以下工具:

  • 一個 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 協議上,若是有自建的服務只要更換地址就能夠了。shell

  • 新建一個腳本 (proxy),修改裏面的代理地址爲本身的代理地址,以下:windows

    #!/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 環境變量路徑下。bash

  • 測試 proxy curl https://www.google.comcurl https://www.google.com 第一個命令能夠獲取到結果,第二個命令不能夠。ssh

  • 測試 proxy go get -v golang.org/x/text/… 能夠正常下載包,其它任何拉取包命令均可以添加 proxy 前綴執行 ,好比 proxy dep ensure -vcurl

截止當前你就配置了一個 go get 自動代理的環境,之後須要FQ操做的指令運行時加 proxy 就能夠了,該方法並不僅適用於 go get,任何須要命令行代理均可以使用。

原理篇

實際原理簡單,找到這種方法也是一種巧合,在入坑 Go 以前我常常用 linux,當時有一些需求須要命令行FQ,找到了三個環境變量 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協議 許可協議。轉載請註明出處!

相關文章
相關標籤/搜索