在使用 Go module 过程中,随着引入的依赖增多,也许你会发现go.mod文件中部分依赖包后面会出现一个// indirect的标识。这个标识总是出现在require指令中,其中// 与代码的行注释一样表示注释的开始,indirect表示间接的依赖。

在执行命令go mod tidy时,Go module 会自动整理go.mod 文件,如果有必要会在部分依赖包的后面增加// indirect注释。一般而言,被添加注释的包肯定是间接依赖的包,而没有添加// indirect注释的包则是直接依赖的包,即明确的出现在某个import语句中。

然而,这里需要着重强调的是:并不是所有的间接依赖都会出现在 go.mod文件中。

间接依赖出现在go.mod文件的情况,可能符合下面所列场景的一种或多种:

直接依赖未启用 Go module

直接依赖go.mod 文件中缺失部分依赖
直接依赖未启用 Go module
如下图所示,Module A 依赖 B,但是 B 还未切换成 Module,也即没有go.mod文件,此时,当使用go mod tidy命令更新A的go.mod文件时,B的两个依赖B1和B2将会被添加到A的go.mod文件中(前提是A之前没有依赖B1和B2),并且B1 和B2还会被添加// indirect的注释。

此时Module A的go.mod文件中require部分将会变成:

require (B vx.x.xB1 vx.x.x // indirectB2 vx.x.x // indirect
)

依赖B及B的依赖B1和B2都会出现在go.mod文件中。

直接依赖 go.mod 文件不完整

如上面所述,如果依赖B没有go.mod文件,则Module A 将会把B的所有依赖记录到A 的go.mod文件中。即便B拥有go.mod,如果go.mod文件不完整的话,Module A依然会记录部分B的依赖到go.mod文件中。

如下图所示,Module B虽然提供了go.mod文件中,但go.mod文件中只添加了依赖B1,那么此时A在引用B时,则会在A的go.mod文件中添加B2作为间接依赖,B1则不会出现在A的go.mod文件中。

此时Module A的go.mod文件中require部分将会变成:

require (B vx.x.xB2 vx.x.x // indirect
)

由于B1已经包含进B的go.mod文件中,A的go.mod文件则不必再记录,只会记录缺失的B2。

总结
为什么要记录间接依赖
在上面的例子中,如果某个依赖B 没有go.mod文件,在A 的go.mod文件中已经记录了依赖B及其版本号,为什么还要增加间接依赖呢?

我们知道Go module需要精确地记录软件的依赖情况,虽然此处记录了依赖B的版本号,但B的依赖情况没有记录下来,所以如果B的go.mod文件缺失了(或没有)这个信息,则需要在A的go.mod文件中记录下来。此时间接依赖的版本号将会跟据Go module的版本选择机制确定一个最优版本。

如何处理间接依赖
综上所述间接依赖出现在go.mod中,可以一定程度上说明依赖有瑕疵,要么是其不支持Go module,要么是其go.mod文件不完整。

由于Go 语言从v1.11版本才推出module的特性,众多开源软件迁移到go module还需要一段时间,在过渡期必然会出现间接依赖,但随着时间的推进,在go.mod中出现// indirect的机率会越来越低。

出现间接依赖可能意味着你在使用过时的软件,如果有精力的话还是推荐尽快消除间接依赖。可以通过使用依赖的新版本或者替换依赖的方式消除间接依赖。

如何查找间接依赖来源
Go module提供了go mod why 命令来解释为什么会依赖某个软件包,若要查看go.mod中某个间接依赖是被哪个依赖引入的,可以使用命令go mod why -m 来查看。

比如,我们有如下的go.mod文件片断:

require (
github.com/Rican7/retry v0.1.0 // indirect
github.com/google/uuid v1.0.0
github.com/renhongcai/indirect v1.0.0
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/text v0.3.2
)


```go
-> % go mod why -m all
# grpc/test
grpc/test# cloud.google.com/go
(main module does not need module cloud.google.com/go)# github.com/BurntSushi/toml
(main module does not need module github.com/BurntSushi/toml)# github.com/Shopify/sarama
(main module does not need module github.com/Shopify/sarama)# github.com/Shopify/toxiproxy
(main module does not need module github.com/Shopify/toxiproxy)# github.com/census-instrumentation/opencensus-proto
(main module does not need module github.com/census-instrumentation/opencensus-proto)# github.com/client9/misspell
(main module does not need module github.com/client9/misspell)# github.com/cncf/udpa/go
(main module does not need module github.com/cncf/udpa/go)# github.com/davecgh/go-spew
grpc/test/src/client/zipkin_simple_client

我们希望确定间接依赖github.com/Rican7/retry v0.1.0 // indirect是被哪个依赖引入的,则可以使用命令go mod why来查看:

-> % go mod why -m github.com/openzipkin/zipkin-go
# github.com/openzipkin/zipkin-go
grpc/test/src/client/zipkin_simple_client
github.com/openzipkin/zipkin-go

上面的打印信息中# github.com/openzipkin/zipkin-go 表示当前正在分析的依赖,后面几行则表示依赖链。grpc/test/src/client/zipkin_simple_client 依赖github.com/openzipkin/zipkin-go,以此类推。由此我们就可以判断出间接依赖github.com/openzipkin/zipkin-go是被grpc/test/src/client/zipkin_simple_client引入的。

另外,命令go mod why -m all则可以分析所有依赖的依赖链。

go mod查看依赖关系相关推荐

  1. IDEA maven项目查自动查看依赖关系,解决包冲突问题

    IDEA maven项目查自动查看依赖关系,解决包冲突问题 参考文章: (1)IDEA maven项目查自动查看依赖关系,解决包冲突问题 (2)https://www.cnblogs.com/jpfs ...

  2. 查看依赖关系 dependency walker(depends)

    简单介绍 Dependency Walker是一个免费的实用工具,它可以扫描任何32位或64位Windows模块(EXE,DLL,OCX,SYS等),并建立所有相关模块的分层树形图.Dependenc ...

  3. rpm 查看依赖关系 依赖谁和被谁依赖

    1. 查询软件包依赖哪些软件 rpm -qR centos-release    安装  R参数的意思就是requires就是依赖哪些软件包 rpm -qpR centos-release 未安装 或 ...

  4. 在IDEA中查看依赖关系(*)

    1.查看项目的依赖关系 2.查看导入的jar包

  5. linux依赖关系查看命令,Linux下查看依赖关系

    我们在开发Linux程序时,经常会遇到查看自己的编译结果是否正常调用外部共享库,至少在编译结果能够查看到这层依赖关系.依赖关系有两种,一种是可执行文件依赖共享库,还有一种是共享库依赖共享库,查看方法如 ...

  6. 可视化查看依赖关系_图可视化分析解决方案KeyLines介绍

    Cambridge Intelligence作为图可视化领域的标杆公司,其产品KeyLine.ReGraph.KronoGraph都是图可视化领域典型解决方案,我们可以通过对KeyLine等相关产品的 ...

  7. Flutter查看库的依赖关系

    在纯Android项目中我们可以执行Task :app:dependencies(Gradle窗口中的app->Tasks->help->dependencies,选中右键运行)查看 ...

  8. 查看某个软件包依赖关系

    Apt.RPM.YUM 查询依赖关系 yum deplist pack_name rpm -qpR pack_name apt-cache depends pack_name # 显示该软件包的依赖关 ...

  9. 查看Python库依赖关系的解决方案

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

最新文章

  1. PCL基础3:点云程序运行时间计时
  2. PIL:python图像处理库的介绍
  3. 如何实现一个权限管理系统?(附源码)
  4. Spring Boot结合spring-data-jpa
  5. 【leetcode】443. String Compression
  6. 开箱即用的安全方案:MaxCompute数据安全方案介绍
  7. 《计算机应用基础》模拟试卷三,2015年《计算机应用基础》模拟试题及答案(一)...
  8. 4国语言软件下载网站源码
  9. easyui crud java_Easyui 创建 CRUD 应用_EasyUI 插件
  10. java8编程入门 pdf_Java8编程入门官方教程(第6版).pdf
  11. JS:读取excel并显示
  12. qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
  13. 【我的Android进阶之旅】APK反编译教程和工具下载
  14. BJ模拟 Different Trips【树上后缀数组】
  15. una到底啥意思_una到底啥意思_Una_英文名Una是什么意思
  16. 职高计算机专业能考大学吗,为什么千万不要上职高 上职高能考大学吗
  17. 【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(图像分类篇)
  18. 协变 (Covariant)、逆变 (Contravariant) 与不变 (Invariant)
  19. zabbix tigger 设置
  20. MySQL调优系列:explain分析SQL的执行计划

热门文章

  1. Node.js学习笔记 更新完毕 2022 coderwhyWEB前端体系课
  2. Active Directory简介
  3. 小L的项链切割(dp)
  4. 图像逆光度的估计方法
  5. 区块链的通用应用模式和相对应的特征
  6. 与佛论禅,rot-13,base64
  7. Mac High Sierra + pyCharm + py3.5 + Moviepy 工厂式视频合成测试
  8. 2022 CCF中国软件大会(CCF ChinaSoft)“金融科技前沿技术与发展”论坛成功召开...
  9. 分组密码算法分析,改进
  10. 智能插座的制作(esp01,继电器,arduino)