为什么要考虑私有仓库
Go语言目前都已经采用了官方统一的 go modules
来管理依赖,后续也不太可能出现比较乱的生态, 因此了解下如何让这个依赖管理正常工作是非常必要的。
对于Github或者其他公有仓库,依赖管理是非常直接和方便的,设置好GOPROXY后,使用 go get
去直接操作依赖,是不会报错的,很方便直接, 但是对于一些公司或者组织,一些代码不能公开的, 那就涉及到私有依赖管理了, 通常而言,直接使用go get
肯定会报错,去网上搜搜也不太全,设置完git url替换 之后,依然会报错。 本文主要是讲述,如何进行开发设置而不报错。
对于没有子目录的gitlab项目
如下面这种方式:
# 仓库地址
https://gitlab.com/group/project
# gomodule 名称为
gitlab.com/group/project
可以使用如下命令进行设置, 设置完成之后,则可以通过 go get
自动获取到依赖
# 设置GOPRIVATE环境变量
go env -w GOPRIVATE=gitlab.com
go env -w GOPRIVATE=gitlab.bitmartpro.com
# 设置URL替换,把https转为ssh获取依赖
git config --global url."git@gitlab.com".insteadOf "https://gitlab.com"
git config --global url."git@gitlab.bitmartpro.com:".insteadOf "https://gitlab.bitmartpro.com/"
# 如果遇到https报错,可以设置如下,如果本身就是正常的https就不用去管了
git config --global http.sslVerify false
按照如上方法设置一下,你就能轻松通过 go get
来获取到私有的依赖,但这种方式有一个弊端,就是如果项目放在子目录下面,则依赖获取仍然会失败,下面就会讲一下两种在子目录存在的情况下,如何正常去获取私有依赖的方法。
对于子目录的gitlab项目
如下面这种方式
# 项目地址
https://gitlab.com/group/subgroup/project
# go module 名称
gitlab.com/group/subgroup/project
即使我们设置了正常的ssh key,和git的url替换,仍然会得到报错
The project you were looking for could not be found or you don't have permissions to view it.
当我们用搜索引擎去搜去解决问题的时候,我们基本上搜到的结果都是让你去改 go module 的名称,如下
rm go.mod go.sum
go mod init gitlab.com/myuser/foogroup/barlib.git
go mod tidy
cd /go/src/another_project
go get gitlab.com/myuser/foogroup/barlib.git
它要求,必须要以 .git
结尾,这样是一种比较简单的解决方案,但是正常的go module 命名一般是不带 .git
结尾的。 发生这种情况的原因是,它go get尝试发现给定路径上的模块以找到请求的 Go 模块存储库。只有找到存储库后,工具才会执行git clone或git checkout使用 SSH 密钥进行身份验证。问题归结为这样一个事实:如果没有 Gitlab 访问令牌,就无法列出/查看私有Gitlab 子组。 所以这个时候,我们就要用到下面这种方法。
- 在gitlab中创建token
Gitlab->Preferences->Access Tokens
- 对于windows系统, 你可以先设置一个HOME的环境变量,指向你的用户目录,然后在用户目录下创建
_netrc
文件; 对于Mac/Linux 则可以直接创建~/.netrc
文件 - 按照如下方式编辑
~/.netrc
文件
machine gitlab.com
login my_gitlab_username
password my_gitlab_token
- 上述machine是指你的gitlab仓库的地址
- login 则为你的gitlab的用户名
- password就是第一步创建的gitlab访问token
结合如上几种方式,你应该可以完整的解决掉你的go 获取私有依赖的问题。