14-Go Modules
直接使用 go get ...
添加私有仓库依赖时,会出现以下错误:
1 |
|
从错误信息可以看出来,我们使用私有仓库时通常会配置
ssh-pubkey
进行鉴权,但是go get
使用https
而非ssh
的方式来下载依赖,从而导致鉴权失败。Go官方已经回答了为什么 go get 使用 https 而非 ssh 方式的原因,简单来说就是为了安全考虑,防止中间人攻击
https://go.dev/doc/faq#git_https
Go 官方也为拉私有包的用户提供了一个方法,便是
.netrc
文件,这是 git 工具在命令行使用 https 方式访问时的认证文件。
如果配置了GOPROXY
代理,错误信息则是如下样式:
1 |
|
从错误信息可以看出,go get
通过代理服务拉取私有仓库,而代理服务当然不可能访问到私有仓库,从而出现了404错误。
在
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
版本之后,前面介绍的解决方案又会导致go get
出现另一种错误:1
2get “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了。
所以我们需要两步来解决这个问题,后面两步看情况。
设置
GOPRIVATE
环境变量。1
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
添加如下配置:1
2
3
4[url “git@github.com:”]
insteadOf = https://github.com/
[url “git@gitlab.com:”]
insteadOf = https://gitlab.com/即可强制
go get
针对github.com
与gitlab.com
使用ssh
而非https
如果你通过 https 访问私有仓库,可以在用户根目录下的
.netrc
文件加上 git 仓库登录账号就行了。1
echo "machine 仓库地址 login 用户名 password 密码" > ~/.netrc
如果私有库不支持 https 协议,设置跳过CA证书校验:
go env -w GOINSECURE='gitlab.com/xxx'