前言:
Go 程序由 Go 包组合而成的,Go 程序的构建过程就是确定包版本、编译包以及将编译后得到的目标文件链接在一起的过程, Go 语言的构建模式历经了三个迭代和演化过程,分别是最初期的 GOPATH、1.5 版本的 Vendor 机制,以及 Go Module,而对于module模式,只需要简单的go mod命令就可以成为一个go module项目,极大地方便了我们管理包的过程。
现在,我们就最新的Go Module构建模式,聊聊几种它的常用操作。
为当前 module 添加一个依赖
场景:在我们开发项目时,我们会经常为项目引入第三方包,并借助这些包完成特定功能,那么如何使用go module引入这些第三方依赖呢?
我们以常用的第三方库,zap日志库为例:
直接引入zap库,会发现zap依赖已经爆红,运行会出现依赖没有添加的错误,并提示用 go get 添加
我们使用 go get 命令手动引入依赖,在go.mod里新增了zap依赖,版本为v1.25.0
require ( go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.25.0 // indirect )
如果依赖项有很多,我们可以直接使用 go mod tidy 命令一步到位,跟手动 go get 效果一样。
升级 / 降级依赖的版本
场景:开发过程中,当我们直接使用go mod tidy会自动引入最新依赖,可能会对不兼容之前的项目,这时候就需要对依赖进行升级或者降级。
先说明一下,go module采用语义版本规范,格式为 vX.Y.Z X为主版本号,Y为次版本号,Z是补丁版本。主版本号相同的,新版本会兼容旧版本,但主版本不同,可能会不向下兼容。
还是以zap为例:
使用 go list -m -versions go.uber.org/zap , 查看zap版本号,如图:
假设我们要对当前版本进行降级到1.22.0
这时,使用命令:go get go.uber.org/zap@v1.22.0
如果再进行升级到1.23.0
使用相同的命令即可:go get go.uber.org/zap@v1.23.0
会发现,go.mod里为我们最新引入的版本。
注意,go module对于主版本号为1或0的,无需加版本信息,但如果大于1,就需要在包路径上加入版本路径,如引入go-redis:
使用go mod tidy命令
移除一个依赖
移除一个依赖很简单,一般在智能代码编辑器,如goland 或 vscode中直接 Ctrl+S 保存即可自动移除依赖,或者使用强大的 go mod tidy 一步到位。
特殊情况:使用 vendor
场景:主要是在一些不方便访问外部网络的环境下,需要用到vender作为module补充。
使用 go mod vender 创建
对于空导入说明
空导入是指,在依赖包前加一个 _ 项目不会用到里面的库,但是会执行里面的 init 函数。