Go mod拉取私有仓库 · 音视频/C++/k8s/Docker等等 学习笔记 · 看云
[TOC]
## 概述
在使用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`在处理该域名下的所有依赖时,会直接跳过`GOPROXY`和`CHECKSUM`等逻辑,从而规避掉前文遇到的所有问题。
针对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` 表示仓库地址