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

2,339 阅读4分钟

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

前言

记录加入青训营的每一天的日笔记

背景

开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率

对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发

对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上

  • 工程项目不可能基于标准库0-1编码搭建
  • 管理依赖库

GOPATH 模式

GOPATH为环境变量 包含bin、pkg、src三部分

$GOPATH:项目根路径

  • src:项目源代码
  • bin:项目编译的二进制文件 可执行程序
  • pkg:项目编译的中间产物 加速编译 第三方依赖包

运行方式:

所有工程代码要求放在GOPATH/src目录下 工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用 在 $GOPATH/src下进行 .go 文件或源代码的存储,我们可以称其为 GOPATH 的模式

缺点:

  • 没有版本控制的概念
  • 所有项目都要放在$GOPATH/src目录下,不在当前目录则不能编译

GO Vendor模式

解决 GOPATH模式 所有项目都在$GOPATH/src目录的问题 可以随处可以创建项目,不用扎堆 src 目录下

原理:本地化构建

在每个项目下都创建一个vendor目录,每个项目所需要的以来都会下载到自己的vendor目录下。在使用包时,会先从当前项目下的vendor目录查找,然后再从GOPATH中查找,都没有找到最后才在GOROOT中查找(依赖寻址方式:vendor -> GOPATH)

缺点:

  • 放弃了依赖重用,使得冗余度上升
  • 无法控制依赖的版本 更新项目可能出现依赖冲突 导致编译出错

Go Module模式

1.16版本后默认开启的模式

通过go.mod文件管理依赖的版本

通过go get/go mod指令工具管理依赖包

工程不用全放在gopath/src目录下

定义版本规则和管理项目依赖关系

主要改动:

  • GO MODULE模式下所有依赖的包存放在$GOPATH/pkg/mod目录下
  • 项目中需要有go.mod文件,来应用$GOPATH/pkg/mod

依赖管理三要素

  • 配置文件 描述依赖 go.mod
  • 中心仓库管理依赖库 Proxy
  • 本地工具 go get/mod

依赖配置 go.mod

module example.com/foobar
​
go 1.16
​
require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)
​
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0 
replace example.com/banana => example.com/hugebanana

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径。
  • go:用于设置预期的 Go 版本。
  • require:用于设置一个特定的模块版本。
  • exclude:用于从使用中排除一个特定的模块版本。
  • replace:用于将一个模块版本替换为另外一个模块版本。

这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version,目前从 Go1.16 的代码里来看,还只是个标识作用,暂时未知未来是否有更大的作用。

go mod命令

常用的go mod命令如下:

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖 

go get命令

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version 如果下载所有依赖可以使用go mod download命令。

快速使用go module

  • SET GOPROXY=goproxy.cn (这是win环境下的) export GOPROXY=goproxy.cn (这是mac环境下的)
  • go mod init [包名] // 初始化项目(如果你是初始化项目直接 go mod init 就好了)
  • 在目录文件下会生成go.mod和go.sum文件 go.mod 里面包含了所有的包!
  • 在文件里面引入包名的时候有的编辑器会报错但是是可以正常编译的
  • 下载包使用go get
  • 修改包的版本号直接去go.mod文件修改然后go mod download

小结

今天学习到的内容还需要进一步的消化,我也是打算将并发编程这一块的内容熟悉透彻了再进行下一部分的课程学习。如果笔记中有错误的地方也希望掘友们可以及时的提出纠正。