如何在 Go 项目中引入私有仓库

警告
本文最后更新于 2022-07-19,文中内容可能已过时。

相信无论是哪个公司,在开发项目时都会封装一些 kit 库,或者是 sdk,以提供一些通用的功能接口给其他项目使用。这些 kit 库几乎都不会开源,以私有库的形式存在。在 Go 项目中,引入一个公共开源库很容易,比如这样:

1
2
3
4
5
6
7
8
9
module github.com/samplerepo/sampleproject

go 1.12

require (
  github.com/pkg/errors v0.8.0
  github.com/spf13/cobra v0.0.4
  github.com/spf13/viper v1.3.2
)

如果我们想从私有存储库导入 Go 包怎么办?也很简单:确保我们的go mod可以访问私有 Git 存储库。

GOPRIVATE

go mod命令相关的最重要的环境变量有两个,一个是GOPROXY,另一个是GOPRIVATE,二者的值都是依赖库的地址(支持正则,多个地址以逗号分隔),二者的区别是:前者是公共依赖的地址,后者是私有依赖的地址。 所以我们要将私有依赖库的地址添加进环境变量:export GOPRIVATE="github.com/xxxx"

私有存储库

在底层,Go 使用 Git 来拉取指定版本的依赖项。因此,我们设备上的 Git 配置必须具有凭据才能访问私有存储库。哪些东西可以作为凭据呢?我们很容易想到:SSH or Token

SSH 凭据

我们在 Terminal 输入下面这个命令,将原本使用 https 协议拉取依赖的方式替换成 ssh 协议。

关于如何给 Git 配置 ssh 请看我的这篇帖子:为M1笔记本搭建后端开发环境,其中提到了 Git 如何通过 ssh 协议拉代码。

1
2
3
4
git config \
  --global \
  url."git@github.com".insteadOf \
  "https://github.com"

照道理有了 ssh 凭据是可以拉取私有仓库的,但是我遇到了问题(非常诡异):我可以 git clone unnoo(公司私有仓库)的任何依赖项,但是执行go mod download等 Go 的 Module 相关操作就是出现下面这个报错。

1
2
3
4
5
go: github.com/unnoo/gopkg@v0.5.60: invalid version: git ls-remote -q origin in xxxxxx: exit status 128:
	git@github.com: Permission denied (publickey).
	fatal: 无法读取远程仓库。
	
	请确认您有正确的访问权限并且仓库存在。

如果出现了上述情况,基本上都是因为 ssh 公私钥认证出了问题,可以做如下几种方式检查:

  1. 验证 Github 端是否上传了公钥(公钥位置: github 账户- > settings -> ssh keys)
  2. 是否配置了 ssh,以及 ssh 是否使用了对应的私钥
  3. 使用ssh -T git@github.com验证账户
  4. 如果上面都验证过,而问题还是没有解决的话,使用命令配置下私钥ssh-add -k ~/.ssh/github_id_rsa

经过上面一通检查后,解决了报错,成功使用 go mod 拉取公司的私有 kit 库。

Token

使用 Token 拉取私有仓库分两步走:

  • 在 github (https://github.com/settings/tokens) 上创建一个 token, 并授予私有仓库所有访问权限 (Full control of private repositories)
  • 使用创建的 token 配置本地 git
1
2
3
4
git config \
  --global \
  url."https://${user}:${personal_access_token}@github.com".insteadOf \
  "https://github.com"
Buy me a coffee~
室长 支付宝支付宝
室长 微信微信
0%