GoCenter是如何做到的?

更新:从2021年5月1日起,GoCenter中央存储库已经被淘汰,所有功能都已弃用。有关中心日落的更多信息请阅读弃用博客
我最近写了一篇博客眼见为实(这也是你获得一件很棒的围棋衬衫的机会),关于从版本控制系统下载围棋模块和从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 /国防部/缓存”)。
如有问题或意见,请在这里留言或留言推特!
