Go 私有仓库下载
直接使用 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'