这是我参与「第五届青训营」笔记创作活动的第5天,今天我将总结一下Go语言中依赖管理的相关概念,主要从Go语言依赖管理的演进与Go Module的使用两方面来进行总结。
Go语言依赖管理的演进
Go Path
简介
是一个环境变量,结构一般为: bin:项目编译的二进制文件 pkg:项目编译的中间产物,用于加速编译 src:项目源码
依赖管理原理
项目代码直接依赖于src下的代码,使用go get下载下载最新版本的包至src目录下。
弊端
无法实现package的多版本控制。
Go Vendor
依赖管理原理
在项目目录下添加vendor文件,所有依赖包副本形式放在$ProjectRoot/vender中 依赖寻址方式:vender=>GOPATH
优点
通过每个项目引入一份依赖的副本,解决了需要同个package依赖的冲突问题。
弊端
无法控制依赖的版本,更新项目可能会出现依赖冲突,导致编译出错
Go Module
简介
通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包
优点
可以定义版本规则和管理项目依赖关系
Go Module的使用
依赖管理三要素
- 配置文件,描述依赖:go.mod
- 中心仓库管理依赖库:Proxy
- 本地工具:go get/mod
依赖配置
go.mod
module example/project/app //依赖管理基本单元
go 1.16 //原生库
require(
example/lib v1.0.0
... //标识依赖:[Module Path][Version/Pseudo-version]
)
version的定义
- 语义化版本:
${MAJOR}.${MINOR}.${PATCH}MAJOR版本:大版本,不同MAJOR代码之间可能不兼容 MINOR版本:小版本,一般可能新增函数,需要做到至少向下兼容 PATCH版本:BUG修复版本,一般做一些代码Bug修复 - 基于commit伪版本:vX.0.0-yymmddhhmmss-哈希码 //前面类似于语义化版本
Go依赖管理工具
Go get
go get example.org/pkg [@update|@none|@v1.0.0|@23dffdd5|@master]
Go mod
go mod [init|download|tidy]
注:在实际开发过程中,尽量提交之前执行下 go tidy ,减少构建时无效依赖包的拉取。
使用go mod需要开启:go env中默认GO111MODULE=off 此时go命令行将不会支持module功能,将会沿用旧版本通过vendor目录或GOPATH模式来查找
GOPROXY
从下图可以看到Go语言通过Proxy这种开源代理服务器进行依赖包下载。
开启Go mod与GOPROXY设置
之前初接触踩坑记中也写过需要在cmd中修改几个go的参数:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
现在也可以解释其原因了...