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

更新:截至2021年5月1日,GoCenter中央存储库已经关闭,所有功能都已弃用。有关中心日落的更多信息,请阅读弃用博客文章
我最近写了一篇博客说眼见为实(你也有机会获得一件很棒的Go 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模块是压缩包,并具有一些附加文件。这些文件包括.info(包含版本号和提交时间)和.mod(您下载的模块的模块文件)。Go客户端以特定的方式在您的机器上需要这些文件和实际的源代码。没有GOPROXY变量设置时,Go客户端必须自己计算这些文件,并将它们与GOPATH美元/ pkg /国防部/缓存/下载文件夹中。它还必须将文件移动到GOPATH美元/国防部/ < vcs > / <模块>。与GOPROXY变量设置后,所有文件都已在前面的步骤中下载到GOPATH美元/ pkg /国防部/缓存/下载。Go客户端只是提取压缩文件并将源文件(不包含元数据文件)放入其中GOPATH美元/国防部/ < vcs > / <模块>。繁荣!解压缩文件比计算校验和、生成文件和获取裸git存储库的副本要快得多。
总结胜利
望三胜,当你不设GOPROXY变量,Go客户端采取的步骤是:
- 查找获取源的位置和协议,这可能需要额外的HTTP和HTML处理(参见获取导入)。
- 执行“git克隆”并在
GOPATH美元/ pkg /国防部/缓存/风投 - 生成压缩文件、计算校验和、生成元数据文件并将它们放入其中
GOPATH美元/ pkg /国防部/缓存/下载 - 将源文件(不包含元数据文件)放入
GOPATH美元/国防部/ < vcs > / <模块>
与GOPROXY设置,Go客户端必须做的事情要少得多:
- 下载模块的.mod、.info和.zip文件,并将它们放入
GOPATH美元/ pkg /国防部/缓存/下载(只有3个HTTP GET操作) - 将源解压缩到
美元GOPATH / pkg /国防部/ < vcs > / <模块>
因此,使用GoCenter,您可以删除查找模块的HTTP和HTML处理,“昂贵”的源代码克隆和元数据文件的生成。
你为什么不试试GoCenter呢?
亲眼看看,你可以跑。”去找-v ./…使用和不使用GOPROXY设置,并查看控制台和磁盘的差异(美元GOPATH / pkg /国防部/缓存”)。
如有问题或意见,请随时在这里留言或给我留言推特!