goproxy / goproxy.cn

The most trusted Go module proxy in China.
https://goproxy.cn
MIT License
6.81k stars 393 forks source link

问题:goproxy.io与goproxy.cn go.sum值不同 #183

Closed tttoad closed 1 year ago

tttoad commented 1 year ago

go get github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.4 goproxy.io h1:SnVVx4rEO3SsK7iuvlQlpKOnTlrULlIGL/udhpOmc/g= goproxy.cn h1:XRAk4HBDLCYEdPLWtKf5iZhOi7lfx17aY0oSO9+mcg8= proxx.golang.org h1:XRAk4HBDLCYEdPLWtKf5iZhOi7lfx17aY0oSO9+mcg8=

想确认一下,如何判断那个代理的数据是最新的?

aofei commented 1 year ago

GOSUMDB 的默认值是 Go 官方的校验和数据 sum.golang.org,也就是说如果在你没有修改 GOSUMDB 的情况下,你需要使用兼容 sum.golang.orgGOPROXY,比如默认的 Go 官方代理 proxy.golang.orggoproxy.cn,但是 goproxy.io 是不兼容的。并不存在“某个代理的数据是最新的”这种说法。

此外,GOPROXY 是支持代理校验和数据库的。如果你的 GOPROXYgoproxy.cn,那你不需要再修改 GOSUMDB,因为 goproxy.cn 支持代理 sum.golang.org

aofei commented 1 year ago

补充一下,如果某个模块发布了 v1.0.0 版本,张三通过代理 A拉取了这个版本,接着模块又 force push 重新发布了 v1.0.0 版本,李四通过代理 B拉取了这个版本。此时,代理 A中缓存的是强制篡改前的 v1.0.0,而代理 B中缓存的却是强制篡改后的。所以,为了避免上述情况可能造成的危害(比如通过 force push 来植入恶意代码等),建议最好还是保持 GOSUMDB 为默认值并使用兼容默认值的代理,尽可能地保证可复现构建。

tttoad commented 1 year ago

@aofei goproxy.io 不兼容是指如果GOSUMDB="sum.golang.org"时,go get 应该报校验和不对吗?对于模块出现相同版本号发布两次,建议的处理方案是什么 ? sum.golang.org中记录的sum值是发布一次后就不会再被修改吗?

aofei commented 1 year ago

goproxy.io 不兼容是指如果GOSUMDB="sum.golang.org"时,go get 应该报校验和不对吗?

校验和不对只会在目标模块被篡改时发生,比如通过 force push 来重新发布某个版本,因为模块版本实际内容变了。

对于模块出现相同版本号发布两次,建议的处理方案是什么 ?

没有处理方案,因为那是错误的行为。作为模块作者,如果你发布的某个模块版本中存在问题,那你只应该通过发布新的 patch 版本来解决问题。对于使用者来说,人们不希望看到他们依赖的某个模块版本在某一天某一刻毫不知情地发生了变化,毕竟万一这个“变化”是个安全隐患呢。这就是为什么要尽可能确保可复现构建。

sum.golang.org中记录的sum值是发布一次后就不会再被修改吗?

Go 的模块校验和数据库在设计上不可逆,所以某个模块版本一经记录就意味着再没有任何办法修改它了。


推荐保持使用默认的 sum.golang.org 还有一个重要原因是,它是 Go 语言开发者广泛使用的校验和数据库,使用默认值可以避免出现“张三拉取到的模块版本数据的 checksums 和李四拉取到的不一致”这种情况。

tttoad commented 1 year ago

校验和不对只会在目标模块被篡改时发生,比如通过 force push 来重新发布某个版本,因为模块版本实际内容变了。

还是有点不太理解,当我配置GOPROXY="https://goproxy.ioGOSUMDB="sum.golang.org" 时,使用go get github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.4 没有报错。当修改成GOPROXY="https://goproxy.cn时发现校验和不对,是因为goproxy.io不会去校验sum.golang.org的值吗?

aofei commented 1 year ago

你两次 go get 前都有清理本地模块缓存吗?比如执行过 go clean -modcache 吗?注意并不是每次 go get 都会触发本地校验的,只有在首次即本地从未缓存过目标模块版本时才会触发校验。

tttoad commented 1 year ago

我知道原因了.. 项目里的go.sumh1:SnVVx4rEO3SsK7iuvlQlpKOnTlrULlIGL/udhpOmc/g=,使用goproxy.io拉并不会报错。删除go.sum时,go get报错校验和不对了。 @aofei 十分感谢你的解答

aofei commented 1 year ago

嗯,那应该就是我在这里 https://github.com/goproxy/goproxy.cn/issues/183#issuecomment-1661866564 说的情况了,你的 go.sum 在生成时所用的模块版本和你现在使用的不一致。

aofei commented 1 year ago

鉴于问题已解决,这个 issue 我就关闭了,如果还有其他问题欢迎随时开新 issue 提问。