现象
在使用gomod模式管理golang包的时候,下载开源的公共包还可以,但是一旦使用内部或者私有的包,就可能会出现如下所示的问题:
server response: not found: git.xxx.com/xxxxxx/xxx@v0.6.8: unrecognized import path "git.xxx.com/xxxxxx/xxx": https fetch: Get "https://git.xxx.com/xxxxxx/xxx?go-get=1": dial tcp xx.xx.xx.xx:443: connect: connection refused
原因
究其原因,一方面使用如下GOPROXY代理的方式,只能管理开源的golang包及依赖;另一方面,私有的仓库中的项目,需要配置相应的用户权限才能访问,并且通常需要配置跳过相关私有仓库。
GOPROXY="https://goproxy.cn,direct"
Windows系统使用以下命令设置GOPRIVATE为私有仓库地址:
set GOPRIVATE="git.xxx.com"
// 或者go env -w GOPRIVATE="git.xxx.com"
// 或者env:GOPRIVATE="git.xxx.com/"
PS:在命令行中,通过set GOPRIVATE的命令方式,只在当前命令行有效,换个编辑器,使用go env命令查看环境变量,发现还是没有设置,这时候就需要右键[我的电脑]设置该环境变量。
其中,git.xxx.com为私有仓库地址,在解析的时候使用使用前缀匹配的方式,所有的git.xxx.com地址中的所有项目都会被视为private-modules。配置该方式后,对于企业、私有Group等,只要代码仓库地址不变、属于项目组、并且有权限,配置一次就可以无限次拉取该私有仓库中的所有项目。
Linux设置方式,在terminal中输入以下命令:
export GOPRIVATE=git.xxx.com/
其中,git.xxx.com替换为具体的私有仓库域名。
解决方式
- 检查GO111MODULE是否打开
通过go env命令查看GO111MODULE配置是否打开,go 1.12及以下的版本需要配置如下环境变量打开GO111MODULE,go 1.13及以上的版本默认是打开的。
GO111MODULE=on
- 设置代理环境变量
GOPROXY="https://goproxy.cn,directt"
// 或者也可以设置为 GOPROXY="https://goproxy.io,direct"
- 配置私有仓库域名
GOPRIVATE="git.xxx.com" (引号里替换公司私有库域名)
- 检查git config配置是否正确
git config -l 查看git的所有配置
如果git没有配置用户信息,可以通过如下命令设置。
git config --global user.name="xxx"
注意:也可以使用git config --global user.name “xxx” 命令设置用户名,一般是git账户的邮箱前缀,使用global user.email命令设置邮箱,一般只需设置一个用户名即可。
- 将下载代码方式由http改为ssh
执行如下命令将获取仓库项目的方式由http或https改为ssh。
git config --global url."ssh://git@git.xxx.com:port/".insteadOf "https://git.xxx.com/"
由于go install、go mod tidy 命令下载依赖的时候是通过git命令去下载的,而且默认使用http或https协议,上面使用命令修改为ssh协议去获取。
- 查看包之间的依赖关系与权限
在拉取私有包,可以使用-x参数获取详细信息,例如go get -x git.xxx.com/xxx,查看是否存在包与包之间的依赖关系。
go get -x git.xxx.com/xxx
PS:有些私有包可能没有权限,也会导致获取依赖包失败。
- 使用go mod tidy管理go mod依赖
go mod tidy
设置完上面的配置后,如果通过go mod tidy或者go get -x 所需要下载的私有包 命令后,出现下面的信息:
go: git.xxx.com/go-xxx/xxxxx@v0.xxx.0: unknown revision v0.xxx.0
或者
go get: module git.xxx.com/xxx/xxxxxx: git ls-remote -q origin in D:\Go1.16\gopath\pkg\mod\cache\vcs\xxxexxxxxx666xxxx8888xxx: exit status 128:
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
可能是因为在配置GOPRIVATE和SSH方式下载私有包之前已经通过git clone http或https的方式下载过,导致包冲突,把原来下载的包删除,再重新执行git clone ssh://git@git.xxx.com:port/xxxxxx/xxxxx.git的ssh方式下载私有包,然后通过go get -x git.xxxxxx.com/xxxxx或者go mod tidy命令重新下载依赖。
参考
Go填坑之将Private仓库用作module依赖
go mod依赖离线安装_go mod 安装依赖 unkown revision问题解决
使用git config --global设置用户名和邮件