GoCenter是快速的-它是如何做到的?

更新:自2021年5月1日起,GoCenter中央存储库已被淘汰,所有功能已弃用。有关中心日落的更多信息,请阅读弃用博客文章
我最近写了一篇博客眼见为实(这也是你获得一件很棒的围棋t恤的机会),关于从版本控制系统下载围棋模块或从版本控制系统下载围棋模块的速度差异GoCenter.从那篇博客文章中,我们在Gopher社区得到了很多积极的评论。我们还有一些关于"如何“它更快,比如推特上的这个.
要了解GoCenter为什么更快,让我们看看Go客户端是如何获取模块的。让我们更深入地研究一下当你去模块(双关语)。我们将比较设置和不设置的情况GOPROXY变量。
使用GoCenter可以加快Go模块的下载速度,因为它在下载文件时使用了正确的协议,节省了HTTP调用的数量,并且不必在客户端重新创建模块。
获取您的导入
第一个区别始于库的导入。每个用Go编写的应用程序都使用库。这些库可以是标准库,比如“fmt”或“io”或者来自其他地方的。如果不设置GOPROXY变量,并且您的包位于任意预定义的在版本控制系统中,Go客户端将知道如何解析URL以毫无问题地获得模块。如果您的包不在任何这些系统中,Go客户端将执行动态HTML检查并查找如何以及从何处获取模块的元标记。这种方法需要HTTP重定向和HTML解析。当你指着GOPROXY变量到GoCenter, Go客户端向GoCenter发送一个请求来获取模块信息。我们的第一个胜利是不需要复杂的HTML和HTTP处理,而是依赖于一个简单的HTTP请求。当您有许多Go模块“存在”于预定义的版本控制系统之外时,这种情况尤其严重。
获取信息来源
该过程的下一步是将模块获取到您的机器。Go模块打包在zip文件中,并有一些额外的元数据文件,我们将在后面介绍。如果不设置GOPROXY变量,Go客户端将执行“git克隆”并创建一个“裸”存储库GOPATH美元/ pkg /国防部/缓存/风投.当你设置GOPROXY变量到GoCenter, Go客户端将发送一个HTTP GET请求并下载zip文件。我们有第二个胜利,下载文件通常比执行git克隆快得多。在这种情况下,由于Go模块是压缩得非常好的文本文件,您将节省更多带宽(和时间)。
构建模块
接下来是构建模块,以便您可以在Go应用程序中使用它。如前所述,Go模块是zip文件,并有一些附加文件。这些文件包括.info(包含版本号和提交时间)和.mod(下载模块的模块文件)。Go客户端需要以特定的方式在您的机器上使用这些文件和实际的源代码。没有GOPROXY变量集,Go客户端将不得不自己计算这些文件,并将它们与源文件放在GOPATH美元/ pkg /国防部/缓存/下载文件夹中。它还必须将文件移动到GOPATH美元/国防部/ < vcs > / <模块>.与GOPROXY变量设置后,所有文件都已在上一步中下载到GOPATH美元/ pkg /国防部/缓存/下载.Go客户端只是提取压缩文件并放置源文件,而不包含元数据文件GOPATH美元/国防部/ < vcs > / <模块>.繁荣!解压缩文件要比计算校验和、生成文件和获得一个纯git存储库的副本快得多。
总结胜利
看着这三场胜利,当你不设防GOPROXY变量,Go客户端所采取的步骤是:
- 找到获取源的位置和协议,这可能需要额外的HTTP和HTML处理(请参阅获取导入)
- 执行“git克隆”并在中创建“裸”存储库
GOPATH美元/ pkg /国防部/缓存/风投 - 生成zip,计算校验和,生成元数据文件并将其放入
GOPATH美元/ pkg /国防部/缓存/下载 - 将源文件(没有元数据文件)放在
GOPATH美元/国防部/ < vcs > / <模块>
与GOPROXYset, Go客户端需要做的事情要少得多:
- 下载一个模块的.mod, .info和.zip文件,并将它们放在
GOPATH美元/ pkg /国防部/缓存/下载(只有3个HTTP GET操作) - 解压缩源代码到
美元GOPATH / pkg /国防部/ < vcs > / <模块>
因此,使用GoCenter,您可以删除用于查找模块的HTTP和HTML处理、“昂贵的”源代码克隆和元数据文件生成。
你为什么不试试GoCenter呢?
亲眼看看,你可以跑"去找-v ./…"使用和不使用GOPROXY设置,并查看控制台和磁盘中的差异("美元GOPATH / pkg /国防部/缓存”)。
如有任何问题或意见,请在这里留言或在推特!
