go Module对包的管理
一.go包的管理的进化过程
1.GOPATH
GOROOT的说明:go在安装时,其实是安装的go的标准依赖库和编译器,GOROOT环境变量存放的就是这些内容
GOPATH:环境变量是指向用户域,是用户私有库以及第三方库的所在位置
GOPATH的缺点:对于同一个pkg不能在GOPATH中存放不同的版本
为了解决GOPATH的缺点,之后使用vendor进行解决该问题
2.Vendor
Vendor是将本项目的依赖放到本项目的vendor中,这样不同项目所需要的同一个pkg的不同的版本,也不会有影响。项目编译时,编译器会优先从vendor中查找依赖,若vendor中没有,则从GOPATH中继续寻找。
vendor的搜索顺序:
首先是当前文件所在的路径寻找vendor,若没有,再从上级目录继续寻找,之后是项目根目录继续寻找,若没有找到则从GOPATH中查找
vendor的缺点:无法清晰查看目录包中的依赖的关系,依赖包升级不方便审核
为了解决上面的问题,出现了Go Module
3.Go Module
首先说下语义化版本:v(major).(minor).(patch)
major:主版本号
minor:子版本号
patch:补丁
Go Module 记录了依赖情况,版本号和hash值
3.1.使用方式
go mod init:完整的为:go mod init [module]
这样会自动生成go.mod文件,内容如下
当使用go get 依赖包时,会自动修改go.mod和go.sum中的内容
3.2.go.mod文件的四个名称的说明
1.module:声明的module的名称
2.require:声明的依赖及其版本号
3.replace:替换require中声明的依赖,使用另外的依赖及其版本号
4.exclude:禁用指定的依赖
5.indrect:间接依赖
间接依赖出现的原因:1)直接依赖未启用Go Module,即没有go.mod文件。2)直接依赖的go.mod文件缺失的部分依赖
查看依赖关系 :go mod why -m
自动整理go.mod:go mod tidy
6.incompatible
如果major的版本号大于1,其版本号还需要体现在module名字中,比如:
github.com/Rain/m 为例,假如其版本号为v3.6.0由于其module名中未附带版本信息,这个module就是不规范的module,此时在go.mod中就会出现incompatible关键字。
当执行go build/go get 时都会更新go.mod/go.sum文件
go get -v github.com/google/uuid@v1.1.0下载固定版本的module,会导致go.mod和go.sum中进行对应的更新
二.go mod常用的操作命令
查看依赖关系 :go mod why -m
自动整理: go.mod:go mod tidy
下载所有依赖: go mod download 若加上 x 表示打印详细的下载信息。
将依赖复制到 vendor 目录下: go mod vendor
打印模块依赖图: go mod graph
初始化go.mod文件:go mod init