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文件都应该提交至版本库.

扩展阅读