前言

在企业内部项目的开发过程中,我们经常会发现一些跨项目的代码,为了便于维护,我们将这部分代码进行抽象,单独作为一个扩展包,这种方式极大的提高了在多个项目中的维护效率。

但是同时也有一个问题,就是如何管理这些扩展包,并且让 Go modules 能够快速的找到它!

设置 GOPROXY

这个需要 Gitlab 开启 Go Proxy 功能,目前 Go Package Registry 生产环境不可用,所以不建议使用这种方式!!!

go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/{id}/packages/go,https://proxy.golang.org,direct'

最好将私有扩展包的 URL 放在代理列表的最前面,另外就是如果有多个包,且网络允许的情况下,直接将 GOPROXY 的值设为 direct 即可。

配置身份认证

这一步主要是为了 Go modules 从 Gitlab 下载 Release 包时能够通过身份认证,因为私有项目是需要登录后才能访问的。

在当前系统用户目录下创建一个 .netrc 文件,用于存放内部 Gitlab 的 Personal Access Token。

echo "machine <url> login <username> password <token>" >> ~/.netrc
  • : 替换为内部 Gitlab 的域名,e.g. gitlab.example.com
  • : Gitlab 的用户名, e.g. root@gitlab.example.com
  • : 你的 Gitlab Personal Access Token

禁用扩展包校验

使用 Go 1.13 及更高版本下载依赖项时,获取的源将根据校验和数据库 sum.golang.org 进行验证。因为我们的扩展包是私有的,所以 sum.golang.org 无法对其进行校验。

go evn -w GONOSUMDB="gitlab.example.com/services/modules"

这里可以具体到某个项目,也可以只到域名级别。

使用扩展包

现在就可以通过 go get 命令来安装私有扩展包了。

go get gitlab.example.com/services/modules/inquiry@latest

总结

实现了私有扩展包的安装后,又有了新的问题,每次都需要将私有扩展包的改动 PUSH 到 Gitlab Repository 后,再手动在项目中执行 go get 才能更新项目中的依赖。

这样的流程太过于麻烦,所以我在想有没有一种类似 PHP Composer 的那种解决方案,按找环境区分依赖的来源。例如在开发环境可以将某个依赖的扩展包指向到本地的一个目录,在 CI/CD 构建时,则从 Gitlab 中获取扩展包。

终于找到解决方案了,在 Go 1.18 版本中新增了 Workspace 功能,能够很好的解决这个问题,具体的方案可以参考《Go 使用 Workspace 实现本地扩展包》

I hope this is helpful, Happy hacking…