前几天,需要对一个两年前写的项目添加点儿新功能,需要用到一个 Http 客户端包,于是就用了 https://github.com/go-resty/resty
这个插件包。
我先是直接在项目根目录下执行了以下包的安装命令:
go get -v github.com/go-resty/resty
然后,在业务代码中按照官方文档实例化了 client := resty.New()
对象,紧接着我想先启动一下项目,看这个包是否正常可用,结果,执行 go run main.go
命令时,就报以下错误了。

问题分析
我们可以看到报错提示是:note: module requires Go 1.17
因为,我现在维护的这个项目是两年前写的,那个时候 Go 比较稳定的版本还是 go 1.16
因此,这个项目也是基于 go 1.16
版本写的。可近期 Go 的版本迭代非常快,截止发稿,现在 Go 已经迭代到 go 1.22.2
版本了,并且每个版本之间差异也不小,因此跨版本之后就需要解决一些兼容性问题。
回到刚刚的报错提示:module requires Go 1.17
我们大致可见就是有部分插件包依赖了 Go 1.17 高版本,而我现在本地版本还是 Go 1.16,版本不兼容导致,那么,应该如何解决这个问题呢?
探讨解决方案
当然,我们可以直接升级一下 Go 的版本,这个问题应该就会迎刃而解。但是,这个项目已经在生产环境上跑了两年多了,现在贸然的去升级 Go 版本,感觉还是有些不妥,毕竟没有什么比项目稳定更加重要了。
不能去升级 Go 版本,那就只有一种解决方案了。
找到有问题的插件包,然后对有问题的依赖包进行降级就好了。但是,问题是:如何快速且准确的找到这个依赖包呢?
我们再回到刚刚的报错提示,可以仔细查看到,可能跟 golang.org/x/[email protected]
这个包有关系,毕竟错误信息中就含有它。
那么,按照这个思路,我们可以一步一步查到每个包的依赖,方便我们好定位问题。
一般情况下,此时,我们可能会想到直接使用 go mod graph
命令来查看项目现有的结构图,但是,如果这个项目依赖的包不算多,我们还可以勉勉强强捋得清楚相关的依赖,如果依赖包比较多了,估计也看麻了吧……
借助工具来查找依赖关系
你会发现根本无从看起,那么,我们是否可以借助某些工具来查看呢?其实,我也不确定有没有这样的工具,那还是老套路呗,直接去 Github 上搜一波试了看,结果,一搜还真有!
就是这个包:https://github.com/PaulXu-cn/go-mod-graph-chart
看了下包介绍:“一个能将 go mod graph
输出内容可视化的无依赖小工具” ,这不正是我需要的嘛!
果断用起来!
由于这个小工具是一个二进制文件,于是直接使用 go install
命令安装了下。