go mod依赖管理一文详解

253 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

1. go的依赖管理发展

image.png

  • GOPATH 所有的依赖都放置在同一路径下,可以复用下载的依赖,但是当不同项目需要依赖不同版本的依赖时,就很容易出现冲突问题。
  • govendor 解决了依赖库版本不一致的问题,但是不好控制(了解即可)
  • go mod 使用go.mod文件管理以来的版本,通过go get下载依赖

2. go.mod 文件分析

module xx/xx/xx/v2
go 1.16
require (
        xx/xx/xx v1.3.3
        xx/xx/xx v0.0.0-20200330080233-e4ea8bd1cbed        
	xx/xx/xx v2.2.1+incompatible	
	xx/xx/xx v0.3.0 // indirect
)
exclude (
	xx/xx/xx v1.3.3-rc.0
)

replace xx/xx/xx => xx/xx v1.3.3

retract (
    v1.0.0 // 废弃的版本,请使用v1.1.0
)

module xx/xx/xx/v2是指该项目的module路径,/v2是指版本信息,可以省略。

go 1.16是指项目需要的最低go的版本

require()是项目需要的其他依赖:

  • xx/xx/xx v1.3.3指明了项目需要的依赖以及版本号。
  • xx/xx/xx v0.0.0-20200330080233-e4ea8bd1cbed是时间戳性质的版本号。
  • xx/xx/xx v0.3.0 // indirect是指依赖需要的依赖
  • xx/xx/xx v2.2.1+incompatible是指依赖的库的major版本大于引用的版本,不合规范。

exclude()指引用依赖时,跳过某些版本

replace xx/xx/xx => xx/xx v1.3.3指替换某些依赖

retract()声明废弃的版本

3. go mod依赖下载工具

  • go get xx/xx/x@${parameter}

    ${parameter}可以选择的参数如下: image.png

  • go mod tidy 根据go.mod文件添加或者删除项目所需要的依赖

4. 可能出现的问题汇总

  1. go get -u xx/xx/x

这个操作会升级依赖的依赖,有可能会引发依赖版本不兼容问题导致的编译不通过,比如thrift的0.13与0.14不兼容。

  1. 循环依赖问题

image.png

要注意避免循环依赖问题。