Go依赖库管理初探
Go作为一个新语言,其依赖管理系统一直不够完善,官方直到去年才在1.11加入modules(也叫vgo). 在此之前社区不满官方的官僚,还有过一阵激烈的讨论,讨论流行第三方库dep的不被采纳而官方自造轮子.
最近在项目首次使用了modules系统,但还是采用的兼容的vendor模式. 总体用下来还不错,一些github库也已经使用该方式.
下面简要列下常见用法.
Go Package
在开始讲模块之前,先说下基础的包用法。
因为使用package时经常会遇到各种问题,有时候不太适应,记录下注意的点.
基础用法
- 包命名规则: 不建议使用-_和驼峰命名.
- 包有两种类型:可执行包和utility包.
- 包的查找路径为:先 GOROOT 再 GOPATH
- init(): 初始化包全部变量,在main()之前执行。(一个包可以多个init,以字母顺序执行)
go install app
# 如果存在package main和 main 入口函数,则在 GOPATH\bin 下生成 app 二进制可执行文件.
# 如果不存在package main, 会在 GOPATH\pkg 下生成 app.a
go run app
# 直接执行可执行包
// 包别名
package myapp "app"
// 初始化包,但不使用
package _ "app"
// 执行顺序
// 先初始化全局变量,再初始化init()
使用package
创建vendor文件夹,并把package文件夹放在vendor目录下
规范:包名和文件夹名必须保持一致。
隐含为:
- 生成的*.a文件与文件夹名一致
- go install和 package后面跟的都是文件夹名
使用本地目录
如果要使用本地module, 可以在mod文件使用replace 替换为绝对或相对路径.
Go Module
开启该选项
环境变量设置为开启状态: GO111MODULE=on
set GO111MODULE=on //windows
export GO111MODULE=on //linux
go env -w GO111MODULE=on
如果使用Goland IDE, 到项目 [settings]-[Go modules(vgo)]- 勾选 “Enable Go modules(vgo) integration”
注:从Go 1.13开始, 默认GO111MODULE=auto, 意味着在GOPATH下执行off,在GOPATH外执行设置为on.
使用
主要通过命令 go mod 实现, 具体用法参考 go help mod
常用命令
# 帮助
go help mod
# 国内镜像
go env -w GOPROXY=https://goproxy.io,direct
# 初始化: go mod init [module_name]
go mod init xulizhao.com/golib
# 下载依赖
go get github.com/eclipse/paho.mqtt.golang
# 列出当前模块和它的所有依赖库
go list -m all
# 列出详细依赖信息
go list -m -json all
# 查看某库的可用版本
go list -m -versions github.com/BurntSushi/toml
# 手动下载依赖
go mod download
# 安装缺失的依赖,删除不用的依赖
go mod tidy
# 更新所有依赖到最新版本
go get -u ./...
go clean -i -n github.com/BurntSushi/toml...
查看依赖关系
查看indirect包被谁引入
go mod why -m package.name
# 查询全部
go mod why -m all
go.mod 使用本地依赖
# 替换为本地,也支持相对路径
# 在文件的最后一行require() 之外添加
replace gopkg.in/yaml.v2 => d:/yamlv2
# 等价于命令行
# go mod edit -replace gopkg.in/yaml.v2=D:/temp/go/yaml
# Goland 添加本地依赖
# File - Open - 选择依赖文件夹并 Attach
使用vendor管理本项目依赖
注: 需要说明的,这些依赖只包含本项目用到的直接依赖, 第三方库的自身依赖由它本身维护.
# 生成本地依赖
go mod vendor
# 构建时指定vendor
go build -mod=vendor
#或者
GOFLAGS=-mod=环境变量信息
语义化版本维护库
semantic import versioning的支持.
# 把模块路径定义为类似 rsc.io/quote/v3 的格式
版本管理
vendor目录和go.mod , go.sum文件都应该提交至版本库.