1.12
版本解决方案
在1.11
和1.12
版本中,比较主流的解决方案是配置git
强制采用ssh
。
这个解决方案在许多博客、问答中都可以看到:
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
。