请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

go.mod添加间接依赖的条件

那些在go.mod中被// indirect标注的依赖只是直接依赖所依赖的且没有go.mod的间接依赖吗,我这里的项目中有些间接依赖有go.mod,为什么还会被加上// indirect

正在回答 回答被采纳积分+3

1回答

少林码僧 2024-03-19 23:02:00

当一个模块直接依赖于另一个模块,而后者又依赖于第三个模块时,Go 模块系统会自动检测并生成 "indirect" 标记的 require 子句。这样做的目的是为了表示间接依赖关系,同时避免将间接依赖模块作为项目的直接依赖。

0 回复 有任何疑惑可以回复我~
  • 提问者 坚定信仰的无忧 #1
    您的教程原话是:
    后面有indirect注释的代表间接依赖包,没有的代表直接依赖包。需要注意的是只有当间接依赖包版本不包含go.mod文件时候才会记录到go.mod文件中。  
    
    我明确一下我的问题,例如(我的go项目A的直接依赖是B,B依赖C):
    1. 如果C不包含go.mod,会被添加 // indirect吗(课堂上是这样讲的)?我本地测试的不是,就算间接依赖包有go.mod也会被添加indirect,就是indirect是否和有无go.mod有关系
    2. 您的回答中,有点模糊,我知道有些间接依赖会被添加indirect,但是具体是哪些呢?
    希望能给出一个比较详细准确的回复,谢谢!
    回复 有任何疑惑可以回复我~ 2024-03-20 11:29:23
  • 少林码僧 回复 提问者 坚定信仰的无忧 #2
    会加indirect注释情况:以A依赖B,B依赖C为例:
    1. 如果B有go.mod文件,C没有go.mod文件,则C会被标记indirect;
    2.如果B不存在go.mod文件,则不管C是否存在go.mod都会被标记indirect
    3.如果B依赖C和D两个包,但B的go.mod中只有C而缺失了D(也就是B的go.mod不完整),则B和D将会被标记为indirect。
    你上面提到的A直接依赖B,B依赖C,C没有go.mod,你本地测试C并没被A的go.mod标记为indirect是这样吗?可以提供下你本地代码的github地址吗?
    回复 有任何疑惑可以回复我~ 2024-03-21 02:19:57
  • 提问者 坚定信仰的无忧 回复 少林码僧 #3
    我是以我的项目引入gin依赖包做案例的(已经进行了go mod tidy):
    module awesomeProject
    
    go 1.21.3
    
    require github.com/gin-gonic/gin v1.9.1
    
    require (
    	github.com/bytedance/sonic v1.9.1 // indirect
    	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
    	xxxxxxx
            xxxxxxx
    )
    我就查看了gin的go.mod,gin直接依赖sonic,sonic也有go.mod;
    也就是A(我的项目)依赖B(gin),B(gin)依赖C(sonic),但是B和C都有go.mod, 并且B的go.mod也包含C,就是不符合您上述的三种情况,但是sonic还是A被写上了// indirect
    
    我就是想通过这个案例去真正理解依赖之间的关系,但是很多出现的情况和我学的有点矛盾,所以才来问一下
    回复 有任何疑惑可以回复我~ 2024-03-21 20:56:16
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信