Go 语言依赖管理的趋势:Go Module 以及 Go 仓库

关注世界领先 DevOps 平台 JFrog

在 JFrog 的 2019 用户大会上,来自微软的高级布道师同时也是开源 Go 依赖管理项目Athens (https://github.com/gomods/athens)的核心贡献者Aaron Schlesinger 为大家介绍了 Go Module 和 Go 的依赖管理的未来趋势。

1. Go 语言依赖管理的痛点

Go 诞生于云原生应用,非常适用于高并发的云原生环境。 但Go 语言在包管理这块备受诟病。

不像 Maven,NPM,Docker,这些语言有成熟的依赖管理工具,而 Go 没有。

2. Go 语言依赖管理的历史

· GOPATH

最早的解决Go 依赖问题的工具是 GOPATH。

GOPATH 解决了第三方源码依赖的问题,用户比较容易的能够引用一个 Github 上的第三方代码库,进行打包构建。 但这引入了一个问题,所有的团队依赖的只互联网上的一份源代码,如果这个代码库被人篡改,删除,你们的构建也会受到影响。 为了解决这个问题,社区里提出了 Go Vendoring 的方法。

· Go Vendoring

和 GOPATH 不一样,Go vendoring将第三方依赖的源码下载到本地,并且 checkin 到自己的代码库里进行管理,这就屏蔽的第三方源被修改的风险,同时代码在自己的代码库里管理也比较安全。

但这又引入了新的问题,随着项目的依赖增多,你的代码库可能会越来越大,例如上图,你依赖了 mypkg@v1.2.3, 这个库里有几百兆的图片,当你依赖了这个库,在 pull 代码的时候就大大增加的你的代码库大小。

3. Athens – Go 依赖管理工具

Anthens 是 Go 社区的一个开源依赖管理工具,它能够聚合管理依赖包。 能够对接 github,JFrog GoCenter,JFrog Artifactory。 所以你只需要标注你所有的依赖包的地址,go get 会安装先近后远的顺序帮你下载依赖,并且缓存在本地 mods 目录。 使用 Athens 很简单,它可以在本地运行:

用 Docker 启动 Athens 服务之后,监听 3000 端口。 在 GoProxy 里设置代理地址:

设置好之后,执行 Go build,就能够让 Athens 从 GoCenter 进行依赖包的下载了。 当然 Athens 也能够从 Artifactory 进行 Go 依赖包的下载。

构建完成之后,通过JFrog CLI 进行 Go Build,上传 go module 到 Artifactory 里,还能够享受到依赖关系的记录。

这样你在进行 Go 依赖梳理时,会无比的清晰,不会出现依赖管理混乱,依赖黑洞的情况。

同时也能展示反向依赖视图,来梳理第三方组件在公司内部的使用情况,对应 Go 的包管理来说是神器了。

4. 补充: Go Module 中央仓库 GoCenter.io

GoCenter 是由 JFrog 提供并维护的 Go 依赖组件公有仓库,类似于 JCenter,为 Go 开发者提供第三方依赖下载。 举例: 如果开发者需要下载 apache thrift 包,可以在 Gocenter.io网站里进行搜索 thrift,然后会得到搜索结果:

在项目的 go.mod文件里指定这个地址,在 go 构建的时候就会从 GoCenter 下载这个依赖的压缩包。

注意这里下载的是 zip 包,不是多次下载源文件。 下载完成后会按照版本号存放在本地作为缓存,共享给团队其他人员构建使用。

5. 总结

Go 社区经历了近十年的发展,从 GOPATH,到 Go Vendoring,再到 Go module 进行持续演进,依赖管理的部分正在往 Go Module 这个方面发展,和其他语言一致。 JFrog 提供了公网免费的 GoCenter 的下载服务,欢迎大家使用,同时 JFrog Artifactory 也实现了本地 Go 仓库的功能,解决您 Go 依赖的所有问题。

联系我们

info@jfrogchina.com

长按二维码关注

点击“阅读原文” 进入 JFrog 官网