为什么 go.sum 包含这么多旧包

Why does go.sum include so many older packages

我一直在研究一组项目,处理更新依赖项,有一件事我没有明确的答案,这就是为什么生成的总和文件列出了每个依赖项的许多旧版本.

在我们的项目中,我们通过旧版本的 golang.org/x/crypto 我们通过 replace 指令解决了带有安全修复程序的包发布,但这感觉不太正确,可能会将我们锁定在包的不安全版本中。

现在我已经更新了依赖旧版本 golang.org/x/crypto 的包,并使用替换指令循环回到包并尝试更新,但我仍然看到列出的旧包。

我想知道这对我们的项目意味着什么,以及我如何找到为什么首先包含这些内容?

运行一个简单的 go mod why -m golang.org/x/crypto 揭示了唯一依赖于 golang.org/x/crypto 是我更新的那个。

@JimB 提供了一些关于 go sum 的文档,声明如下

The go.sum file may contain hashes for multiple versions of a module. The go command may need to load go.mod files from multiple versions of a dependency in order to perform minimal version selection. go.sum may also contain hashes for module versions that aren’t needed anymore (for example, after an upgrade). go mod tidy will add missing hashes and will remove unnecessary hashes from go.sum.

并且在 go sum 中定义的结果包集来自 minimal version selection 过程,这似乎是一个很深的话题。

一个示例是将 "google.golang.org/grpc/metadata" 导入 module,将 运行 go mod tidy 导入 module 以及结果总和的一小部分文件如下:

github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=

每个对版本的引用都表示最小版本选择算法图中的一个节点

将以下内容添加到 mod 文件

replace github.com/golang/protobuf => github.com/golang/protobuf v1.4.3

和 运行 a go mod tidy,protobuf 的结果总和条目更改为:

github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=

因为 replace 指令指示替换所有版本,所以依赖关系图中的所有节点都替换为 v1.4.3,这只是简化为包含单一版本的依赖关系 v1.4.3

至于我遇到的漏洞扫描器问题,它的作者似乎没有意识到应该如何检查 Golang 的依赖关系以及如何将 module 升级到列出间接依赖关系的 1.17在 mod 文件中并没有阻止总和条目标记项目的漏洞。