Go填坑之將Private倉庫用做module依賴

本文同步發佈於我的博客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.111.12版本中,比較主流的解決方案是配置git強制採用sshurl

這個解決方案在許多博客、問答中均可以看到:代理

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在處理該域名下的全部依賴時,會直接跳過GOPROXYCHECKSUM等邏輯,從而規避掉前文遇到的全部問題。

另外域名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.comgitlab.com使用ssh而非https

後續版本

將來可能會有其餘的變化,若是出現了的話,我會繼續完善這篇文章。

順便爲本身寫的日誌庫slf4go打個廣告。

相關文章
相關標籤/搜索