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

更新:自2021年5月1日起,GoCenter中央存储库已被淘汰,所有功能已弃用。有关中心日落的更多信息,请阅读弃用博客文章
TL;博士:Go模块的缓存/代理/注册表/存储库术语有很多混淆。经过深思熟虑,我们一致同意Go模块存储库.
名字的事!
众所周知,在软件工程中,命名是造成拖延的唯一主要原因,可能排在费用报告之后。为某件事起一个名字可能是极其困难的,从一组建议中挑选一个正确的名字只是稍微容易一点。此外,命名棒——我们在开始时选择的将会伴随我们很多年,所以让我们尝试为存储Go模块的系统选择一个正确的术语。与JFrog Artifactory,雅典计划,GoCenter已经发布,并且谷歌奠定的“Go镜像生态系统”的整体愿景在美国,现在是决定如何称呼这些服务的最佳时机(或许只是有点晚了?)
这篇博文反映了雅典项目维护者、JFrog Artifactory和GoCenter供应商和贡献者之间的讨论。我们希望未来的服务提供者会同意我们关于术语的论点。让我们开始吧。
那么Go Modules的缓存/代理/注册表/存储库是什么呢?
它是一面镜子吗?
" Go Module Mirrors "是Russ Cox在他的最新博客来描述存储Go模块的系统。Maven早在2005年就在他们的“settings.xml”模式来描述Maven依赖项的远程位置。虽然由于Maven的流行,我们都明白这意味着什么,但我们觉得这个术语具有误导性。“镜像”指的是一份准确且最新的副本。它包含了“原创”的全部内容。但最初是什么呢?Go没有一个“镜像”可以镜像的规范的中央存储库。
更重要的是,组织存储库没有理由包含来自上游的所有内容!这就像在你的$GOPATH中拥有整个GitHub。为什么?让我们只包含我们需要的东西,在需要的时候自动把东西带进来。
还是缓存?
我们可以使用的另一个术语是“缓存”。毕竟,那些工具缓存Go模块,不是吗?它们像缓存一样存储模块,但“缓存”意味着这些工具不具备也不应该具备的一些功能。
我们经常听到“如果它不起作用,请清除浏览器的缓存”和“删除Maven ~/。m2高速缓存“总是这样。哎哟!缓存是短暂的,很容易清除,除了速度以外没有任何后果。Athens、JFrog Artifactory和GoCenter不能是短暂的,也不容易通过设计被清除。它们都承诺不变性,这是不可能用临时缓存实现的。
也许是代理人?
这个词是围棋团队在命名GOPROXY环境变量,它定义了一个用于获取模块的存储库。不'GOPROXY'实际上定义一个代理?
代理在技术上是这些系统的正确术语,但它们在各种技术社区中有其他含义,我们认为这些含义不适合我们在这里谈论的系统。
当我们想到代理时,我们会想到以下一些事情:
- 用于匿名浏览的服务器
- 公司代理控制员工在工作时访问互联网
- HAProxy
代理通常重定向到上游,受制于包含/排除列表。这只是存储库功能的一小部分。我们是否暗示变量“GOPROXY”名字不好?不!Go模块“代理”是“GOPROXY”所需功能的最低公分母,但这个术语不适用于雅典、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时也使用了“仓库”这个术语Go模块的官方文档!看来我们的方向是对的。
给你,万岁进入模块存储库!
