原文連接:https://blog.thinkeridea.com/201903/go/go_get_proxy.htmlhtml
最近發現技術交流羣裏不少人在詢問 go get 牆外包失敗的問題,你們給了不少解決方案:linux
Go 的社區很活躍,國內 gopher 對 Go 的熱情不會由於牆的存在而減小,從社區想到這麼多FQ方案就能看出來了。git
上面的方法都是可行的,可是總有一些不盡人意,社區也一直在找更好的方法,我一直使用自動代理的方式獲取牆外的包,能夠支持全部 Go 原生拉取包操做,好比 go get、go mod、dep、godep、glide 等各類方法,只須要配置一次,只要在任何原生命令前加前綴運行命令便可,效率很高。github
工具類就先不講原理,想直接獲取方法的同窗看這一部分便可,想了解原理的同窗能夠看後面的原理部分。golang
首先經過 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.com
和 curl https://www.google.com
第一個命令能夠獲取到結果,第二個命令不能夠。ssh
測試 proxy go get -v golang.org/x/text/…
能夠正常下載包,其它任何拉取包命令均可以添加 proxy
前綴執行 ,好比 proxy dep ensure -v
curl
截止當前你就配置了一個 go get
自動代理的環境,之後須要FQ操做的指令運行時加 proxy
就能夠了,該方法並不僅適用於 go get
,任何須要命令行代理均可以使用。
實際原理簡單,找到這種方法也是一種巧合,在入坑 Go 以前我常常用 linux,當時有一些需求須要命令行FQ,找到了三個環境變量 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協議 許可協議。轉載請註明出處!