浅谈 Go 语言依赖管理 | 青训营笔记

106 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

01. 依赖管理

了解 Go 语言依赖管理的演进路线

背景:

image.png

  • 工程项目不可能基于标准库 0~1 编码搭建

  • 管理依赖库

1.1 Go 依赖管理演进

image.png

  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本

1.1.1 GOPATH

  • 环境变量 $GOPATH

image.png

  • 项目代码直接依赖 src 下的代码
  • go get 下载最新版本的包到 src 目录下
GOPATH 弊端

image.png

1. 场景:AB 依赖于某一 package 的不同版本

2. 问题:无法实现 package 的多版本控制

1.1.2 Go Vendor

  • 项目目录增加 vendor 文件,所有依赖包副本形式放在 $ProjectRoot/vensor
  • 依赖寻址方式:vendor => GOPATH

image.png

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

Go Vendor 弊端

image.png

问题:
1. 无法控制依赖的版本
2. 更新项目有可能出现依赖冲突,导致编译出错

1.1.3 Go Module

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

终极目标:定义版本规则和管理项目依赖关系

1.2 依赖管理三要素

1. 配置文件,描述依赖   go.mod

2. 中心仓库管理依赖库   Proxy

3. 本地工具                      go get/go mod

1.2.1 依赖管理 —— go.mod

image.png

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

1.2.2 依赖配置 —— version

  • 语义化版本

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

  • 基于commit 伪版本

    vX.0.0-yyyymmddhhmmss-abcdefgh1234

1.2.3 依赖配置 —— indirect

image.png

A -> B -> C :
                · A -> B 直接依赖
                · A -> C 间接依赖

1.2.4 依赖配置 —— incompatible

image.png

  • 主版本 2 + 模块会在模块路径增加/vN 后缀

  • 对于没有 go.mod 文件并且主版本 2 + 的依赖,会 + incompatible

  • 测试题目

image.png

1.2.5 依赖分发

回源
  • 无法保证构建稳定性:增加/修改/删除软件版本
  • 无法保证依赖可用性:删除软件
  • 增加第三方压力:代码托管平台负载问题

image.png

Proxy

image.png

变量 GOPROXY

GOPROXY = "proxy1.cn, proxy2.cn, direct"

服务站点 URL 列表,"direct"表示源站

image.png

1.2.6 工具 —— go get

image.png

1.2.7 工具 —— go mod

image.png

小结:

  1. Go 依赖管理演进

  2. Go Module 依赖管理方案

总结

依赖管理(Dependency Management)是指对我们无法控制的库、包和依赖所组成的依赖关系网络进行管理。 依赖管理被认为是软件工程中最不被理解和最具挑战性的问题之一。依赖管理中的所有问题都会由于规模的增大变得更加复杂,因为我们意识到我们实际上并不是在讨论单个依赖项导入,而且在一般情况下,我们依赖于整个外部依赖网络。

引用参考

  1. c.biancheng.net/view/4774.h…a
  2. juejin.cn/post/702338…
  3. topgoer.com/%E5%85%B6%E…