概述

在使用go mod的过程中,依赖的包往往是第三方库,当我们自定义一个包并且放在github.com私有仓库时候,按照原来的方法则会有如下问题。

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了。

使用go mod拉取私有仓库

当然Golang在关闭了一扇门,就会打开一扇窗,它提供了一个更方便的解决方案:GOPRIVATE环境变量。解决以上的错误,可以这样配置:

$ export GOPRIVATE=gitlab.aseit.cn/xxx

它可以声明指定域名为私有仓库,go get在处理该域名下的所有依赖时,会直接跳过GOPROXYCHECKSUM等逻辑,从而规避掉前文遇到的所有问题。

针对gitlab仓库如果是http,则有如下方案解决

$  go get --insecure xxxx

此时就会去访问http 而不是 https

而我们发现又会报错

terminal prompts disabled

实际上是因为我们需要拉仓库的代码时, 如果仓库是私有的, 肯定需要身份验证, 我们知道 go get 实际上是 git 拉取代码, 所以我们可以使用添加 SSH 的方式, 也可以直接在命令行中输入帐号密码, 本次介绍命令行, 而在 go get时默认是关闭 git 的输入的, 此时我们需要添加环境变量, 此处我们演示临时添加一个

$ export GIT_TERMINAL_PROMPT=1

再执行 go get就会发现提示输入帐号密码, 输入成功后就可以拉下来

总结

总结以上方法就是:

$ export GIT_TERMINAL_PROMPT=1
$ export GOPRIVATE=gitlab.aseit.cn/xxx
$  go get --insecure xxxx

go get --insecure xxxx中的xxxx 表示仓库地址

--完--