我刚刚继承了一个Go项目,该项目的go.mod文件缺少声明的依赖项,但依赖项位于go.sum文件中:...
cloud.google.com/go/storage v?.?.? <- this is the missing entry in go.mod
...这些是 go.sum 文件中的条目:...
cloud.google.com/go/storage v1.0.0/go.mod h1:<some hash>
cloud.google.com/go/storage v1.5.0/go.mod h1:<some hash>
cloud.google.com/go/storage v1.6.0/go.mod h1:<some hash>
cloud.google.com/go/storage v1.8.0/go.mod h1:<some hash>
cloud.google.com/go/storage v1.10.0 h1:<some hash>
cloud.google.com/go/storage v1.10.0/go.mod h1:<some hash>
...我的问题是:为什么 go.sum 文件中有 5 个版本?如果有其他依赖于这些特定版本的库,那么所有5个库都会编译到二进制文件中吗?由于未声明依赖项,哪个版本的库将链接到我的应用程序代码?我试图在Go文档中找到解释,但找不到,任何帮助都值得赞赏。
1 回答

慕桂英546537
TA贡献1848条经验 获得超10个赞
这些依赖关系很可能是传递依赖关系,即你所依赖的包(或它们所依赖的包等)的依赖关系。go.sum 包含模块的所有依赖项(直接或其他)的行,以便生成可重现。
来自 Go 博客:
除了 go.mod 之外,go 命令还维护一个名为 go.sum 的文件,其中包含特定模块版本内容的预期加密哈希。
...
go 命令使用 go.sum 文件来确保这些模块的将来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会意外更改,无论是出于恶意、意外还是其他原因。go.mod 和 go.sum 都应该签入到版本控制中。
包含的包的版本取决于您所依赖的包的 go.mod 文件。您可能依赖于多个包,每个包可能依赖于不同版本的依赖项。
它们是否最终出现在生成中取决于包含它们的依赖项是否编译到二进制文件中。测试文件/包可能不会发生这种包含的一个例子,这通常取决于测试库及其依赖项。这些永远不会包含在您的普通可执行文件中。go build
您可以检查将包含在构建中的软件包列表,如下所示:
go list -m all
你应该以防万一运行以删除任何实际上不再需要的依赖项。go mod tidy
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消