命名困难:为“Go模块存储库”寻找正确的名称

Go模块存储库

更新:截至2021年5月1日,GoCenter中央存储库已经关闭,所有功能都已弃用。有关中心日落的更多信息,请阅读弃用博客文章

TL;博士:在Go模块缓存/代理/注册表/存储库术语上有很多混淆。经过深思熟虑,我们达成一致Go模块存储库

名字的事!

你知道,在软件工程中,命名是拖延的唯一主要原因,可能仅次于费用报告。为某样东西取一个名字是非常困难的,从一组建议中选择合适的名字只会简单一点。同样,命名棒——我们一开始选择的名字会伴随我们很多年,所以让我们试着为存储Go模块的系统选择一个正确的术语。与JFrog Artifactory雅典计划,GoCenter已经释放,并且b谷歌制定的“Go镜像生态系统”的整体愿景,现在是决定如何称呼这些服务的最佳时机(或者可能只是有点晚?)。

这篇博文反映了雅典项目维护者、JFrog Artifactory和GoCenter供应商和贡献者之间的讨论。我们希望未来的服务提供者会同意我们关于术语的论点。那么,我们开始吧。

那么什么是Go模块缓存/代理/注册表/存储库?

它是一面镜子吗?

“Go Module Mirrors”是Russ Cox在他最新的博客文章来描述存储围棋模块的系统。Maven早在2005年就使用了“镜像”“settings.xml”模式来描述Maven依赖项的远程位置。虽然由于Maven的普及,我们都理解它的含义,但我们觉得这个术语具有误导性。" Mirror "代表一份精确的最新副本。它包含了“原版”的所有内容。但什么是原作呢?Go没有一个“镜像”可以镜像的规范的中央存储库。

更重要的是,组织存储库没有理由包含来自上游的所有内容!这就像在$GOPATH中拥有整个GitHub。为什么?让我们只控制我们需要的东西,在需要的时候自动把东西带进来。

还是缓存?

我们可以使用的另一个术语是“缓存”。毕竟,这些工具缓存Go模块,不是吗?它们像缓存一样存储模块,但是“缓存”意味着这些工具没有也不应该具有的一些功能。

我们经常听到这样的说法:“如果它不工作,请清除浏览器的缓存”和“删除Maven ~/。m2高速缓存总是这样。哎哟!缓存是短暂的,很容易清除,除了速度之外没有任何后果。Athens, JFrog Artifactory和GoCenter不可能是短暂的,也不容易被设计清除。它们都承诺不变性,这是不可能通过临时缓存实现的。

也许是代理人?

这个词是Go团队在命名时创造的' GOPROXY '环境变量,它定义了要从中获取模块的存储库。不'GOPROXY实际上定义了代理吗?

从技术上讲,代理是这些系统的正确术语,但在不同的技术社区中,它们有其他含义,我们认为这些含义与我们在这里讨论的系统不相符。

当我们想到代理时,会想到以下几点:

代理通常重定向到上游,受制于一个包含/排除列表。这只是存储库功能的一小部分。我们是否暗示变量“GOPROXY”命名不当?不!Go模块“代理”是“GOPROXY”所需功能的最低公分母,但这个术语对于像Athens, JFrog Artifactory和GoCenter这样的系统是错误的。这些项目在代理功能的基础上有丰富的特性,比如冗余存储、RBAC、元数据、搜索等等。我们鼓励你看一看!

或者是注册表?

注册中心是描述工件的源和目标的另一个非常流行的术语。例如,NPM使用这个术语。但它的性质是什么呢NPM注册表?它是唯一确定的软件包来源,没有上游。Athens, JFrog Artifactory和GoCenter有(或者至少可以有,可能应该有)上游和模块来自各地。所以注册表不起作用。

这些系统和注册中心之间的关键区别在于联合。注册中心是代码的单一来源和数据库。Athens, JFrog Artifactory和GoCenter是来自众多其他来源的代码数据库- GitHub, GitLab,其他版本控制系统,甚至其他Athens和Artifactory实例。

这是一个仓库!

所以,在这篇博文的标题中留下了这个词。我们相信Athens, JFrog Artifactory和GoCenter是Go模块库。它们具有基本的功能一个代理加上更多,他们缓存模块,但不清除或过期缓存条目,他们也有更多的逻辑。“存储库”是一个定义良好的术语,可以很好地解释这些工具的功能。我们认为这是一个正确的术语。Russ在谈到Athens和JFrog Artifactory时也使用了“repository”这个术语Go模块官方文档!看来我们的方向是对的。

所以这就是它,万岁Go模块存储库