GO语言进阶与依赖管理(三)|青训营笔记

105 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
一、本堂课重点内容:

  • 依赖管理

二、详细知识点介绍:

  • 依赖管理
    2.1.2 Go Vendor
    通过在项目目录下增加vendor文件,所有依赖包的副本形式放在$ProjectRoot/vendor。
    寻址优先级:vendor>GOPATH

image.png

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。

下面举一个Go Vendor的反例。

image.png

在上图中,Project A依赖于Project B与Project C,而Project B与Project C依赖于Package D的两个不同版本,且两个版本互不兼容,这种情况下就会再次出现依赖冲突的问题。

Go Vendor的问题:

  • 无法控制依赖的版本
  • 更新项目可能出现依赖冲突,导致编译出错。

归根结底是因为Go Vendor依然依赖于项目源码,而没有清晰地标识出版本的概念。

2.1.3 Go Module Go Module解决了同一个Project无法依赖同一个Package的多个版本的问题。

Go Module在Golang 1.11版本中实验性引入,1.16版本默认开启。

特点:

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包

Go module实现了我们的终极目标:定义版本规则和管理项目依赖关系。

2.2 依赖管理三要素

①配置文件——go.mod

②中心仓库管理依赖库——Proxy

③本地工具——go get/mod

2.3.1 依赖配置——go.mod

image.png

依赖标识:[Module Path][Version/Pseudo-version]

2.3.2 依赖配置——version

语义化版本:

MAJOR.{MAJOR}.{MINOR}.${PATCH}

v1.3.0

V2.3.0

MAJOR:大版本,可以认为不同MAJOR的版本之间互不兼容。

MINOR:小版本,一般用于新增函数或功能,在同MAJOR下相互兼容。

PATCH:补丁,做代码bug的修复。

基于commit的伪版本:

vx.0.0-yyyymmddhhmmss-abcdefgh1234

v0.0.0-20220401081311-c38fb59326b7

v1.0.0-20201130134442-10cb98267c6c

第一部分与语义化版本相同。

第二部分为提交commit时的时间戳。

第三部分为12位的哈希码。

每次提交commit时go都会自动生成一个伪版本号。

2.3.3 依赖配置——indirect

image.png

indirect关键字:间接依赖

例:A->B->C

直接依赖:A->B

间接依赖:A->C

2.3.4 依赖配置——incompatible

image.png

incompatible关键字:

  • MAJOR版本2及以上的模块会在模块路径增加/vN的后缀。
  • 对于没有go.mod文件且MAJOR版本2及以上的模块,会标记+incompatible关键字。

例题:

image.png

三、引用参考: