Go填坑之将私有仓库用作module依赖
Golang
的发展可以用日新月异来形容,但是这并非褒义词,而是说它在性能、功能上存在诸多不完善之处,相同的功能伴随着小版本的发展,也会出现破坏性 的变化。
但是既然选择了Golang
,无论合不合理,我们都不得不忍受Russ Cox
对该语言天马行空、大刀阔斧的变更。
本文简单介绍一下Go
语言在1.11
版本之后推出的go mod
使用私有仓库时遇到的问题。
直接使用go get
直接使用go get ...
添加私有仓库依赖时,会出现以下错误:
get "gitee.com/xxx": found meta tag get.metaImport{Prefix:"gitee.com/xxx", VCS:"git", RepoRoot:"https://gitee.com/xxx.git"} at //gitee.com/xxx?go-get=1
go get gitee.com/xxx: git ls-remote -q https://gitee.com/xxx.git in /Users/sunmoon/go/pkg/mod/cache/vcs/91fae55e78195f3139c4f56af15f9b47ba7aa6ca0fa761efbd5b6e2b16d5159d: exit status 128:
fatal: could not read Username for 'https://gitee.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-公钥
进行鉴权,但是go get使用https而非ssh的方式来下载依赖,从而导致鉴权失败。
如果你通过ssh
公钥访问私有仓库,记得配置git
拉取私有仓库时使用ssh
而非https
。
可以通过命令git config ...
的方式来配置。也可以像我这样,直接修改~/.gitconfig
添加如下配置:
[url "git@github.com:"]
insteadOf = https://github.com/
[url "git@gitee.com:"]
insteadOf = https://gitee.com/
[url "git@e.coding.net:"]
insteadOf = https://e.coding.net/
经过多次踩坑摸索,这个配置在Linux Mac和Windows环境下略有不同
# Linux Mac
git config --global url."git@e.coding.net:".insteadOf "https://e.coding.net"
# Windows
git config --global url."ssh://e.coding.net:".instanceOf "https://e.coding.net"
GOPROXY
错误
如果配置了GOPROXY
代理,错误信息则是如下样式:
go get gitee.com/xxx: module gitee.com/xxx: reading https://goproxy.cn/gitee.com/xxx/@v/list: 404 Not Found
从错误信息可以看出,go get
通过代理服务拉取私有仓库,而代理服务当然不可能访问到私有仓库,从而出现了404错误。
解决方案就是配置一下GOPRIVATE
export GOPRIVATE=gitee.com/xxx
如果使用goland
的话,也可以在goland
中配置一下
它可以声明指定域名为私有仓库,go get
在处理该域名下的所有依赖时,会直接跳过GOPROXY
和CHECKSUM
等逻辑,从而规避掉前文遇到的所有问题。