Golang Go语言中 go mod tidy 总是安装最新依赖,如何查找哪个模块导致某个包安装最新依赖,提供一个小工具
安装: go install github.com/jan-bar/interesting/findModVer[@latest](/user/latest)
执行:findModVer d:\myproject
结果如下图所示:
根据结果可以找到哪个依赖导致google.golang.org/grpc v1.45.0
使用了这个版本,这样每次执行go mod tidy
会自动修改该模块到v1.45.0
版本。我看了下github.com/spf13/viper v1.11.0
就是用的google.golang.org/grpc v1.45.0
版本,因此我可以通过限制viper v1.11.0
来限制grpc v1.45.0
,这时候执行go mod tidy
就会限制grpc v1.45.0
。通过我这个小工具可以方便的找到哪些库是因为哪个库导致go mod tidy
后修改自己模块的该库到最新版本。
当前也可以在自己库里用如下方法限制版本,但如果该库是公共库,其他人使用时也需要加上这个限制。
replace (
google.golang.org/grpc => google.golang.org/grpc v1.45.0
)
Golang Go语言中 go mod tidy 总是安装最新依赖,如何查找哪个模块导致某个包安装最新依赖,提供一个小工具
更多关于Golang Go语言中 go mod tidy 总是安装最新依赖,如何查找哪个模块导致某个包安装最新依赖,提供一个小工具的实战教程也可以访问 https://www.itying.com/category-94-b0.html
新版本 v1 总是兼容旧的 v1 ,要不兼容时发 v2 版本,golang 的版本管理就是这么设定的,如果你用的库不遵循这条规则建议使用遵循该规则的库或者 fork
更多关于Golang Go语言中 go mod tidy 总是安装最新依赖,如何查找哪个模块导致某个包安装最新依赖,提供一个小工具的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
其实我是想升级一些库,结果 go mod tidy 把另一个库也更新了,我不知道是哪个库升级导致的。最终找到是 viper 这个库导致的。最终我把 viper 设置为旧版本,这个版本 viper 和我当前项目用的 grpc 是同一个版本。
我也觉得你说的对,但是像 grpc 这么基础的库,1.45.0 和当前最新版 1.59.0 也是 v1 版吧,里面有的结构体和对象都不兼容。导致我编译失败,最终找到原因还是 viper 这个配置文件库依赖的 grpc 用了新版本导致。
经验告诉我没事别乱升级🤣🤣🤣
是不是 go mod why 的功能
确切的说是 go mod 机制的问题,更确切的说是有些库不安规范修改代码。按照 semver 版本号规范来说 v1.x.x -> v1.y.y 不应该有不兼容更新。但我就遇到这种问题,还是 grpc 库的问题。go mod 会找到当前模块依赖的所有库,相同的库会使用依赖里面最新版本,你可以看看我在 reddit 上的回复。
https://www.reddit.com/r/golang/comments/17cyxv9/a_tool_to_find_out_which_module_of_gomod_all/?utm_source=share&utm_medium=web2x&context=3
在Golang中,go mod tidy
命令确实会自动更新依赖到符合要求的最新版本。如果你需要查找是哪个模块导致某个包安装了最新依赖,可以使用以下工具和方法:
-
使用
go mod graph
命令:- 运行
go mod graph | grep [包名]
,这个命令会输出依赖链,显示哪个模块依赖了指定的包。
- 运行
-
使用
go mod why
命令:- 运行
go mod why -m [包名]
,这个命令会显示哪个模块导致了指定的包被包含在依赖中,从而帮助你定位是哪个模块引入了该依赖。
- 运行
-
手动检查
go.mod
文件:- 你可以在
go.mod
文件中查看依赖的版本要求。如果某个依赖后面有+
,则表示允许升级到最新版本。你可以检查是否有这样的依赖,并判断是否是它们导致了最新版本的安装。
- 你可以在
此外,虽然没有一个特定的“小工具”专门用于查找这个问题,但上述方法结合使用,通常可以有效地定位问题。在开发过程中,建议定期使用go mod tidy
来保持依赖的整洁和最新,同时也要关注依赖的变更日志,以避免破坏性变更的引入。