go get 用來動態獲取遠程代碼包的,目前支持的有BitBucket、GitHub、Google Code和Launchpad。這個命令在內部實際上分成了兩步操作:第一步是下載源碼包,第二步是執行go install。下載源碼包的go工具會自動根據不同的域名調用不同的源碼工具,對應關系如下:
BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)
go get 的參數說明:
-d 只下載不安裝
-f 只有在你包含了-u參數的時候才有效,不讓-u去驗證import中的每一個都已經獲取了,這對於本地fork的包特別有用
-fix 在獲取源碼之后先運行fix,然后再去做其他的事情
-t 同時也下載需要為運行測試所需要的包
-u 強制使用網絡去更新包和它的依賴包
-v 顯示執行的命令
注意,這里的 –v 參數對我們分析問題很有幫助。
參考:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.3.md
國內由於牆,我們會收到 unrecognized import path 的錯誤,這時候我們如何通過命令行來執行 go get 呢?
這時我們會獲得類似如下錯誤:
go get -u -v golang.org/x/oauth2
Fetching https://golang.org/x/oauth2?go-get=1
https fetch failed.
import "golang.org/x/oauth2": https fetch: Get https://golang.org/x/oauth2?go-get=1: dial tcp 216.58.221.145:443: i/o timeout
package golang.org/x/oauth2: unrecognized import path "golang.org/x/oauth2"
localhost:~ ghj1976$
如果目錄下有以前的版本,則是如下情況:
go get -u -v golang.org/x/oauth2
Fetching https://golang.org/x/oauth2?go-get=1
https fetch failed.
import "golang.org/x/oauth2": https fetch: Get https://golang.org/x/oauth2?go-get=1: dial tcp 216.58.221.145:443: i/o timeout
golang.org/x/oauth2 (download)
Fetching https://golang.org/x/net/context?go-get=1
https fetch failed.
import "golang.org/x/net/context": https fetch: Get https://golang.org/x/net/context?go-get=1: dial tcp 216.58.221.145:443: i/o timeout
golang.org/x/net (download)
Fetching https://golang.org/x/oauth2/internal?go-get=1
https fetch failed.
import "golang.org/x/oauth2/internal": https fetch: Get https://golang.org/x/oauth2/internal?go-get=1: dial tcp 216.58.221.145:443: i/o timeout
golang.org/x/net/context
golang.org/x/oauth2/internal
golang.org/x/oauth2
localhost:~ ghj1976$
這時候我們需要設置代理。代理工具我推薦用 lantern https://github.com/getlantern/lantern
需要注意的是,它的代理地址是: http://127.0.0.1:8787 而不是 http://127.0.0.1:16823/ ,后一個是它的配置網站地址。
以mac為例, 在命令行 Terminal 中設置網絡代理,一般方法如下:
root@ed27c545f7af:~# cat ~/proxy.conf
export http_proxy=http://172.17.42.1:8118
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
參考:https://github.com/tools/godep/issues/154
win下 用 set 代理 export ,參考 https://groups.google.com/forum/#!topic/lantern-users-zh/FiywFrEHSHE
刪除環境變量用
刪除:unset 變量名 參考 http://blog.csdn.net/debug_cpp/article/details/2679991
當前系統上下文的環境設置可以用 env 命令查看。
https://code.google.com/p/go/issues/detail?id=2919
這步代理設置后,我們可以用 wget 命令去試驗效果。參考: https://github.com/getlantern/lantern/issues/3341
另外,go get 使用的 git 、mercurial、svn 設置代理的方法請參考:
https://github.com/golang/go/wiki/GoGetProxyConfig
以我們最常用的 git 為例,
在終端設置:
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
默認不設置代理:
git config --global --unset http.proxy
git config --global --unset https.proxy
查看已經設置的值:
git config http.proxy
參考: http://blog.csdn.net/dengbin9009/article/details/38058153
配置完成后,以下載 golang.org/x/net 為例,執行的返回值如下:
go get -u -v golang.org/x/net
Fetching https://golang.org/x/net?go-get=1
Parsing meta tags from https://golang.org/x/net?go-get=1 (status code 200)
get "golang.org/x/net": found meta tag main.metaImport{Prefix:"golang.org/x/net", VCS:"git", RepoRoot:"https://go.googlesource.com/net"} at https://golang.org/x/net?go-get=1
golang.org/x/net (download)
package golang.org/x/net: no buildable Go source files in /Users/ghj1976/project/mygocode/src/golang.org/x/net
localhost:text ghj1976$
我們可以看到其實是到 https://go.googlesource.com/text/ 這樣的地址去下載源碼的。中間涉及到跳轉和git下載,所以 要注意, 網絡請求的 http_proxy 和 git 的 代理 都需要設置才可以。