goproxy.cn - 为中国 Go 语言开发者量身打造的模块代理

goproxy-logo.jpg

昨天 Go 1.13 终于发布了,虽然比预期延迟了半个月之久,但毕竟迟到总比不到好。git

Go 1.13 的发布为 Go 带来了很多变化(详见:https://golang.org/doc/go1.13 ),有些变化多是开发者没法直接感受到的,但有些又是和开发者平常开发息息相关的。其中,Go modules 的扶正就是此次 Go 1.13 发布中开发者能直接感受到的最大变化。github

Go modules 最先发布于 Go 1.11,通过两个版本的更新后,它做为依赖管理解决方案来讲如今已经变得光彩夺目。随着 Go modules 一块儿被发布的还有一个叫作 Module proxy protocol 的协议,经过它咱们能够搭建 Go 模块代理,最后交由 GOPROXY 环境变量以指引 go 命令后续在抓取模块时的途径。
对于我们中国的开发者来讲,一个优秀的 Go 模块代理能够帮助咱们解决不少问题。好比 Go 语言中最知名的 golang.org/x/... 模块在中国大陆是没法访问到的,之前咱们会用不少其余的办法来抓取他们,而若依靠一个能够访问到它们的模块代理,那么将事半功倍。golang

更由于 Go 1.13 将 GOPROXY 默认成了中国大陆没法访问的 https://proxy.golang.org ,因此咱们中国的开发者从今之后必须先修改 GOPROXY 才能正常使用 go 来开发应用了。为此,咱们联合中国备受信赖的云服务提供商七牛云专门为我们中国开发者而打造了一个 Go 模块代理:goproxy.cn数据库

什么是 goproxy.cn?

goproxy.cn 是目前中国最可靠的 Go 模块代理,这个若是有人存在质疑能够一一测试比对列表中全部能在国内访问的代理。对于那个和 goproxy.cn 域名比较相近的 goproxy.io,我以前已经发表过一篇实测文章(详见:https://studygolang.com/topic... )。网络

goproxy.cn 仍是是一个非营利性项目,目标是为中国和世界上其余地方的 Gopher 们提供一个免费的、可靠的、持续在线的且通过 CDN 加速的模块代理。正由于 goproxy.cn 由中国 Go 语言第一个吃螃蟹的大公司七牛云运行,因此它的稳定性和运行速度都是毋庸置疑的,若是你的网络环境自己不差的状况下,它能快到让你难以想象,比 go get 传统的抓取方式快上了不止几倍。测试

有人可能会问阿里云的也很快,并且阿里云也是大厂,为何不用阿里云的模块代理(mirrors.aliyun.com/goproxy)。我只能说,当我在使用阿里云的代理作初始化 github.com/kubernetes/kubernetes 的测试时,出现了大量的 404 错误以致于初始化操做没法完成……并且它还不支持代理 GOSUMDB 的默认值也就是 sum.golang.org,所以你还得手动修改 GOSUMDB 才可以正常使用 go。在速度旗鼓至关的状况下,为何不考虑直接使用一个更稳定、高可用的呢?并且毕竟 goproxy.cn 这个域名也很好记不是嘛~你只用记住 goproxy.cn,就没了。网站

Q&A

问:在 Go 1.13 中如何使用 goproxy.cn

答:一条 go env -w GOPROXY=https://goproxy.cn,direct 便可。之因此在后面拼接一个 ,direct,是由于经过这样作咱们能够在必定程度上解决私有库的问题(固然, goproxy.cn 没法访问你的私有库)。这个 GOPROXY 设定的工做原理是:当 go 在抓取目标模块时,若碰见了 404 错误,那么就回退到 direct 也就是直接去目标模块的源头(好比 GitHub) 去抓取。而刚好,GitHub 等相似的代码托管网站的原则基本都是“你无权访问的你来讲就是不存在的”,因此我才说经过这样设定能够在必定程度上解决私有库没法经过模块代理访问的问题。阿里云

问:在 Go 1.13 以前如何使用 goproxy.cn

答:一样也是设置环境变量便可,可是得你手动配置,并且还不能使用上述的那个 ,direct 后缀,由于那是 Go 1.13 刚加的特性。详细配置方法能够参见 goproxy.cnREADME 文件spa

问:在 Go 1.13 中如何解决私有库问题?

答:在上述的回答中我有提到能够经过 Go 1.13 为 GOPROXY 新增的“代理列表”特性来为 goproxy.cn 作一个 fallback 选项,也就是 direct(直接从目标模块源头抓取),它就是解决私有库的一种途径,但并非一个完美的解决方案。为此,Go 1.13 还推出了一个 GONOPROXY 环境变量(详见: https://golang.org/cmd/go/#hdr-Environment_variables ),经过设置它咱们能够实现控制让哪些 module path 忽略 GOPROXY,无脑回源。好比 GONOPROXY=*.corp.example.com 就意味着 go 在抓取全部 corp.example.com 的三级子域名下的全部模块时都将忽略 GOPROXY 设置直接回源到目标模块的原地址。3d

问:在 Go 1.13 中如何防止从公共模块代理中抓取的模块被篡改?

答:Go 1.13 新推出了一个 GOSUMDB(默认值是 sum.golang.org ,国内没法访问),就是为了实现这个目的,它的值是一个可信任的模块校验和数据库地址,经过指定它,go 将在抓取完模块时(不管是不是通过模块代理抓取的)对全部模块进行哈希校验,只有和校验和数据库中现有的一致时才算抓取成功。同 GONOPROXY 同样,Go 1.13 也为 GOSUMDB 配对发布了一个 GONOSUMDB,用法一致,做用是控制 go 应该忽略校验哪些 module path 下的模块。

问:分别设置 GONOPROXYGONOSUMDB 很麻烦,有没有更好的办法?

答:有,Go 1.13 为了方便管理私有库规则,还推出了一个 GOPRIVATE,能够简单地理解成经过设置它就同时设置了 GONOPROXYGONOSUMDB


原文做者:@盛傲飞,已取得受权。

相关文章
相关标签/搜索