Golang Go语言中遇到一个 proxy 的神奇问题,疑似官方数据错误?
上周五的时候 GitHub 的一个 Golang 项目的 CI 报错了,看了下 CI 的报错是在 go build 拉取依赖的时候,说是构建的时候拉取到的依赖和 go.sum 中设置的不一致出于安全考虑拒绝执行,于是苦逼的 op 就排查原因,排查了半天一直以为是自己的问题,最后二分法定位到了 proxy.golang.org ,竟然是因为依赖的一个库的某个版本在 proxy.golang.org 上找不到,这个链接:
https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/[@v](/user/v)/v0.0.4.info
访问的时候会报 404 ,而查看这个包的所有版本是可以看到是有 v0.0.4 这个版本的:
https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/[@v](/user/v)/list
我就感觉很神奇,因为我本地构建的时候没有任何问题,然后想了一下,我本地构建的时候都会走 goproxy.cn 的镜像代理,线上的 CI 环境因为是在国外,所以是没有设置代理的,走的是默认的 proxy.golang.org ,于是我就去 goproxy.cn 看了一下:
https://goproxy.cn/github.com/golang-infrastructure/go-pointer/[@v](/user/v)/v0.0.4.info
发现 goproxy.cn 是没问题的,我就很懵逼,不知道是什么情况,难道真的是官方数据错误?
后续解决方案: 这个被依赖的库是 op 自己的,于是死马当活马医,给这个库打了个新 tag v0.0.5 看了看,新 tag v0.0.5 是没问题的,但是 v0.0.4 仍然无法访问。
有问题的 release 在此: https://github.com/golang-infrastructure/go-pointer/releases/tag/v0.0.4
有没有遇到过的大佬指点下迷津
Golang Go语言中遇到一个 proxy 的神奇问题,疑似官方数据错误?
更多关于Golang Go语言中遇到一个 proxy 的神奇问题,疑似官方数据错误?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
刚刚试了下,https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/v/v0.0.4.info 仍然是 404 ,大佬的意思是我要把这个 v0.0.4 的 release 删除掉重新打个 v0.0.4 的 release 吗?
checksum mismatch 对应的是 GOPROXY=direct
404 对应的是 GOPROXY=https://proxy.golang.org
原因大概是你一个月前打 v0.0.4 tag 时删除了好几次:
https://api.github.com/users/golang-infrastructure/events?page=1&per_page=30
我觉得你可以避免进行这种删除 tag 再 push 再打相同名称的 tag 的操作,我个人的理解是 goproxy 从原理上就不建议这样做
可能真的是这个原因,大佬牛皮,我已经记不得当时为啥要删除了重新打 tag 了,看来我以后得注意尽量不进行这类操作,请问我现在有什么补救措施让这个 v0.0.4 的 tag 能用吗
#6
你可以看看这个:
https://go.dev/blog/go116-module-changes#module-retraction
我希望是能标记它而不是让它可用,如果能的话,那生态的安全性会受到威胁吧
嗯。。有道理,感谢大佬解惑,撒花结贴 ❀❀❀
你删了 tag , 又没有走官方 proxy 拉包吧?因为你本地是 gorpoxycn , 所以上面有记录。
go sumdb 只会记录他第 1 次见到某个 tag 的 hash ,你修改了 tag 以后他不认后面的,也是出于防止投毒的考虑
#10
确实,重发 tag 这种需求非常少见,基本都是标注废弃然后发个新的 tag 。
重发 tag 要是能允许的话那安全性就别想了。。
不能说非常少见,只能说完全没有。npm 或者 pypi 这样的中心式的源,都是只允许删除或者 yank/deprecated 某个版本,不可能允许更改的。go 虽然是分布式的源,但是他实际上也用中心化 sumdb 实现了限制。
针对您提到的Golang中遇到的proxy神奇问题,以及疑似官方数据错误的疑虑,以下是一些专业的分析和建议:
- 确认代理设置:首先,请检查您的Golang环境变量中的GOPROXY设置。如果您使用的是默认的国外代理(如
https://proxy.golang.org
),在国内网络环境下可能会遇到访问问题。您可以尝试更换为国内可访问的代理,如https://goproxy.cn
。使用命令go env -w GOPROXY=https://goproxy.cn
进行设置。 - 私有库设置:如果您需要访问私有库(如Gitlab或Gitee),可以通过设置GOPRIVATE来跳过这些库的代理。使用命令
go env -w GOPRIVATE=*.gitlab.com,*.gitee.com
进行设置。 - 模块校验问题:如果您在构建过程中遇到与模块校验相关的超时问题,可能是因为默认的GOSUMDB设置导致的。您可以尝试关闭模块校验,使用命令
go env -w GOSUMDB=off
,或者设置为国内提供的校验服务,如go env -w GOSUMDB="sum.golang.google.cn"
。
如果以上建议仍未解决您的问题,建议详细查看错误日志,以便进一步定位问题原因。同时,也可以考虑在Golang社区或相关论坛寻求帮助。