之前 go mod 用的比较少,而且一直听社区有各种抱怨,所以也兴趣寥寥。新公司的项目直接使用了 go mod,本来觉得无非是个简单的工具,不需要学习,结果在一个简单的依赖上却浪费了很多时间。

先来看看我碰到的例子:

package mainimport "fmt"import registry "github.com/apache/dubbo-go/registry"
import zk "github.com/apache/dubbo-go/registry/zookeeper"
import xds "mosn.io/mosn/pkg/xds"func main() {var r registry.Registryfmt.Println(r)var z zk.Optionfmt.Println(z)var x xds.Clientfmt.Println(x)
}

导致冲突的原因,可以随便找个目录 go mod init 一下,然后 go build。然而编译不过去。实际上是因为 go mod 帮我选择了 github.com/envoyproxy/go-control-plane 这个库的错误版本,mosn 中直接依赖了这个库的 0.6.9 版本,但是在 go build 的时候被非常“好心”地升级到了 0.8.0,怎么回事?

图比较明显,go mod why 现在显然是一坨垃圾。只能通过 go mod graph|grep 来找原因。

这里有个问题,我的程序其实并没有依赖 dubbo-go 里的 consul 这部分代码,我们用 go mod vendor 把程序的外部依赖保存下来,也可以得到验证:

/Users/xargin/test/gomod/vendor/github.com/apache/dubbo-go
~/t/g/v/g/a/dubbo-go git:master ❯❯❯ grep -iR consul ./
~/t/g/v/g/a/dubbo-go git:master ❯❯❯

所以这里 go mod 帮我们选择了一个连间接依赖都算不上的外部库指定的版本来进行更新。知道原因的话,解决方法也就简单了,本来对 github.com/envoyproxy/go-control-plane 有依赖的也就只有 mosn,只要 replace 就好:

replace github.com/envoyproxy/go-control-plane => github.com/envoyproxy/go-control-plane v0.6.9

这里的问题还算简单,如果碰上大项目,出了 go build 不出来的问题,还得用 go mod graph 一个一个去 grep,心累。

现在 go mod 提供的工具其实也并不方便。看看前几天的一篇文章:《etcd go module 的灾难》[1]

用起来真是不省心。

有一些网友已经做了 go mod graph 的可视化,但是碰上大项目,基本出来的图不是给人看的:

对于碰到依赖冲突的用户,其实主要是想看关键包的依赖路径。以及冲突发生的路径。

简单写了一个小工具[2]来支持这个诉求。上面提到的例子会输出很多可能冲突的 pkg,找一下 go-control-plane

Conflict in pkg github.com/envoyproxy/go-control-plane paths are:cch.com/c -> github.com/apache/dubbo-go@v1.3.0 -> github.com/hashicorp/consul@v1.5.3 -> github.com/envoyproxy/go-control-plane@v0.8.0cch.com/c -> mosn.io/mosn@v0.11.0 -> github.com/envoyproxy/go-control-plane@v0.6.9

参考资料

[1]

《etcd go module 的灾难》: https://colobu.com/2020/04/09/accidents-of-etcd-and-go-module/

[2]

小工具: https://github.com/cch123/gomod-conflict-detect

Go Modules 的智障版本选择相关推荐

  1. 来啊,一起来智障啊:国外大火游戏人类一败涂地究竟有多好玩?

    人类一败涂地好玩吗?人类一败涂地手游什么时候上线?之前一款已经上线很久都不温不火的游戏一败涂地却在近期火了.是的,生活已经太艰苦,智障一点又何妨? 这款游戏虽然打着物理解谜的旗号,却有很多主播发现了它 ...

  2. 擦地机器人修理_不要智障机器人,擦地机器人就选iRobot,干湿两擦用了就知道...

    笔者的工作单位离家稍远,所以家庭的清洁任务一直是老婆大人承担,在有了孩子之后时间就变得更加紧张,也是看在眼里疼在心里,而父母年纪大了更不想麻烦两位老人,所以一直就想着能有一款懒人机器人给老婆大人当一个 ...

  3. 赠书 | 人工智能变“人工智障”?关于因果关系的新科学

    文末有福利哦! 每当别人跟我提起"无人驾驶"汽车技术如何强大,又被大众赋予了怎样的期待,我都会想起HBO电视剧Silicon Valley<硅谷>中的一个情节: 硅谷大 ...

  4. AI 产品经理:别让你的智能对话产品变“智障”

    http://www.woshipm.com/ai/2393344.html 聊天功能的人工智能经常被大家吐槽"人工智障",究其原因,人类对话的本质其实是思维的交流或交换,让机器到 ...

  5. 扫地机器人腿是咕噜_扫地机器人|如何避免买到“智障”,看这篇

    不知道大家是不是也有这样的感受:每年都为给老娘买礼物伤透了脑筋,简直可以上升为人生第二大难题(第一大难题是每天吃什么).不买吧,在羡慕别人家的孩子同时暗搓搓责怪我不孝:买吧,99%责怪我浪费钱.我太难 ...

  6. 喂,315吗?我花299元买到一只人工智障!

    2017年,AlphaGO刷爆朋友圈:碳基围棋天才柯洁居然输给了硅基计算机.这让"人工智能"迅速走红,进入公众视野. 人工智能为何这么强?2019年,距离充满人工智能设备的未来还有 ...

  7. 从零开始造一个“智障”聊天机器人

    腾讯DeepOcean原创文章:dopro.io/nlp_seq2seq- 智能机器人在生活中随处可见:iPhone里会说话的siri.会下棋的阿法狗.调皮可爱的微软小冰--她们都具有一定的智能,能够 ...

  8. 全球首家机器人酒店“大裁员”!别了,人工智障

    [CSDN 编者按]早有 Echo 音响午夜异常启动的"灵异事件",近有小米 AIoT 开发者大会上"答非所问"的小爱同学,我们似乎三五不时就能在各种报道中看到 ...

  9. “人工智障”,我们还能忍你多久?

    "每年我们都能看到媒体上人工智能失败案例的报道,背后是否反思了为什么会发生这些啼笑皆非的事儿?本文盘点了人工智能的失败事件,与大众与专家看待人工智能的态度,试图找到所谓"人工智障& ...

最新文章

  1. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖
  2. ActiveMQ中Queue生产者
  3. matlab样条插值如何用,三次样条插值matlab实现
  4. ASSERT报错:error C2664: “AfxAssertFailedLine”: 不能将参数 1 从“TCHAR []”转换为“LPCSTR”...
  5. 在打字稿中,是什么! (惊叹号/ bang)运算符取消引用成员时?
  6. docker 制作本地镜像_Docker系列-(2) 镜像制作与发布
  7. 正向混合云和反向混合云解析
  8. html ubb c,UBB代码和HTML代码的区别
  9. onenote导入html文件,OneNote加入:获取HTML内容
  10. 蓝阔无线打印服务器设置,蓝阔打印服务器远程打印
  11. 原生JS实现拖动滑块验证登录效果
  12. Sublime Text 一键删除空白行的方法
  13. MATLAB之LU分解法(十)
  14. mfc treectrl设置背景透明_微信透明头像怎么弄 专用透明头像图片更换设置教程闽南网...
  15. 模拟器和平精英连接服务器没有响应,和平精英模拟器卡顿解决方法一览
  16. 高考计算机会考等级划分标准,高中学业水平考试等级是怎么划分的
  17. OSChina 周五乱弹 ——做宇宙最低调的程序员.
  18. GB28181协议开发介绍
  19. Java Drp项目实战——Drp知多少
  20. excel报表导入失败问题记录

热门文章

  1. No module named ‘XX‘
  2. 彻底搞清楚浏览器渲染过程
  3. 我犯的错误--关于数据库类型不对
  4. KDE Applications 19.04 发布,包含大量更新
  5. ubuntu双系统把win7设置为默认启动选项
  6. Oracle 11g RAC 添加新节点及故障解决案例
  7. lua 元表/元方法
  8. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
  9. CodeForces - 1450C2 Errich-Tac-Toe (Hard Version)(思维+构造)
  10. POJ - 3417 Network(树上差分)