本文同步發佈於我的博客。html
Golang
的發展能夠用突飛猛進來形容,可是這並不是褒義詞,而是說它在性能、功能上存在諸多不完善之處,相同的功能伴隨着小版本的發展,也會出現破壞性的變化。git
可是既然選擇了Golang
,不管合不合理,咱們都不得不忍受Russ Cox
對該語言天馬行空、大刀闊斧的變動。github
本文簡單介紹一下Go
語言在1.11
版本以後推出的go mod
使用私有倉庫時遇到的問題。golang
go get
直接使用go get ...
添加私有倉庫依賴時,會出現如下錯誤:ssh
get "gitlab.com/xxx": found meta tag get.metaImport{Prefix:"gitlab.com/xxx", VCS:"git", RepoRoot:"https://gitlab.com/xxx.git"} at //gitlab.com/xxx?go-get=1 go get gitlab.com/xxx: git ls-remote -q https://gitlab.com/xxx.git in /Users/sulin/go/pkg/mod/cache/vcs/91fae55e78195f3139c4f56af15f9b47ba7aa6ca0fa761efbd5b6e2b16d5159d: exit status 128: fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled Confirm the import path was entered correctly. If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
從錯誤信息能夠明顯地看出來,咱們使用私有倉庫時一般會配置ssh-pubkey
進行鑑權,可是go get
使用https
而非ssh
的方式來下載依賴,從而致使鑑權失敗。gitlab
GOPROXY
錯誤若是配置了GOPROXY
代理,錯誤信息則是以下樣式:性能
go get gitlab.com/xxx: module gitlab.com/xxx: reading https://goproxy.io/gitlab.com/xxx/@v/list: 404 Not Found
從錯誤信息能夠看出,go get
經過代理服務拉取私有倉庫,而代理服務固然不可能訪問到私有倉庫,從而出現了404錯誤。this
1.12
版本解決方案在1.11
和1.12
版本中,比較主流的解決方案是配置git
強制採用ssh
。url
這個解決方案在許多博客、問答中均可以看到:代理
git config --global url."git@gitlab.com:xxx/zz.git".insteadof "https://gitlab.com/xxx/zz.git"
可是它與GOPROXY
存在衝突,也就是說,在使用代理時,這個解決方案也是不生效的。
1.13
版本解決方案在1.13
版本以後,前面介紹的解決方案又會致使go get
出現另外一種錯誤:
get "gitlab.com/xxx/zz": found meta tag get.metaImport{Prefix:"gitlab.com/xxx/zz", VCS:"git", RepoRoot:"https://gitlab.com/xxx/zz.git"} at //gitlab.com/xxx/zz?go-get=1 verifying gitlab.com/xxx/zz@v0.0.1: gitlab.com/xxx/zz@v0.0.1: reading https://sum.golang.org/lookup/gitlab.com/xxx/zz@v0.0.1: 410 Gone
這個錯誤是由於新版本go mod
會對依賴包進行checksum
校驗,可是私有倉庫對sum.golang.org
是不可見的,它固然沒有辦法成功執行checksum
。
也就是說強制git
採用ssh
的解決辦法在1.13
版本以後GG了。
固然Golang
在堵上窗戶以前,也開了大門,它提供了一個更方便的解決方案:GOPRIVATE
環境變量。解決以上的錯誤,能夠這樣配置:
export GOPRIVATE=gitlab.com/xxx
它能夠聲明指定域名爲私有倉庫,go get
在處理該域名下的全部依賴時,會直接跳過GOPROXY
和CHECKSUM
等邏輯,從而規避掉前文遇到的全部問題。
另外域名gitlab.com/xxx
很是靈活,它默認是前綴匹配的,全部的gitlab.com/xxx
前綴的依賴模塊都會被視爲private-modules
,它對於企業、私有Group等有着一勞永逸的益處。
提示:若是你經過ssh
公鑰訪問私有倉庫,記得配置git
拉取私有倉庫時使用ssh
而非https
。
能夠經過命令git config ...
的方式來配置。也能夠像我這樣,直接修改~/.gitconfig
添加以下配置:
[url "git@github.com:"] insteadOf = https://github.com/ [url "git@gitlab.com:"] insteadOf = https://gitlab.com/
便可強制go get
針對github.com
與gitlab.com
使用ssh
而非https
。
將來可能會有其餘的變化,若是出現了的話,我會繼續完善這篇文章。
順便爲本身寫的日誌庫slf4go打個廣告。