开源代码托管平台 SourceHut 宣布把 Go Module 镜像列入“黑名单”,并将于 2023 年 2 月 24 日禁止对 Go Module 镜像进行 git 访问。
据介绍,从 2 月 24 日开始,用户在从 SourceHut 仓库导入模块的 Go 软件包上使用go get
或类似命令时,将会遇到类似于以下的错误消息:
$ go get
go: downloading git.sr.ht/~sircmpwn/foobaz v0.0.0-20230108094957-81402546c10e
go: git.sr.ht/~sircmpwn/[email protected]: verifying module: git.sr.ht/~sircmpwn/[email protected]: reading https://sum.golang.org/lookup/git.sr.ht/~sircmpwn/[email protected]: 404 Not Found
server response:
not found: git.sr.ht/~sircmpwn/[email protected]: invalid version: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/568e5edafe93f7887c0b6f718b0f17ea91c63c35822fb28628535f172b5429b7: exit status 128:
fatal: unable to access 'https://git.sr.ht/~sircmpwn/foobaz/': The requested URL returned error: 429
解决方案:
$ export GOPRIVATE=git.sr.ht
$ go get # works
有关更多详细信息,请继续阅读。
对于 Go 开发者来说,他们需要通过 git 获取 Go Module,因此开发者使用“git.sr.ht/~sircmpwn/dowork”进行导入将会由工具链通过 git 获取相应的仓库,以使其在用户的 Go 环境中可用。每个请求都通过 proxy.golang.org 上的代理服务进行路由,该服务提供了许多功能:
- 通过 Google 的缓存提供可靠和快速的 Go Module 下载访问
- 存储 Go Module 的冗余副本以确保可用性
- 为校验数据库 (checksum database) 记录其校验的独立来源
- 提供新 Go Module 的索引
但这带来了许多缺点。例如大多数 Go 开发者并不知道他们获取的每个软件包都伴随着对 Google 服务器的请求,这意味着需要和 Google 确保信任关系来返回真实的软件包。此外,如果底层的源仓库消失或与缓存不同步,这个问题对 Go 开发者来说是不可见的,这可能会导致他们的软件依赖于不再存在的模块或模块版本。
对于 SourceHut 来说,代理服务会定期从源码仓库中获取 Go 软件包,以检查是否有更新。这些请求来自许多服务器,它们没有相互协调以减少其工作,并且频率可高达每小时 2500 次,往往一次就有十几个克隆,而且通常是高度冗余的:一个 git 仓库每小时可被取用 100 次以上。
SourceHut 表示,这些流量会产生过大的后台工作负载。他们曾联系 Go 团队合作寻求解决方案,但没有成功。因此,他们决定屏蔽 Go Module 镜像,等到上述问题解决后会重新恢复对 Go Module 镜像的访问。