1. go mod 简介
go mod 是 Go 语言的依赖管理工具,类似于 Node.js 中的 npm 或者 Python 中的 pip,可以大大简化依赖的管理。
它主要解决了这些问题
依赖关系混乱,不清楚具体使用了哪些包和版本
不同机器无法复现相同的依赖构建,导致构建失败
上传代码时缺失依赖,导致他人无法构建
go mod 的主要功能有
使用 go.mod 文件记录依赖信息
自动下载依赖包并缓存在 GOPATH/pkg/mod 目录
可以查询、添加、删除依赖包
可以指定依赖版本,锁定版本
可以设置代理,实现国内下载加速
go mod 基本概念
module:一个模块,通常对应一个代码仓库,一个 module 拥有独立的依赖信息
package:一个 module 中的代码包
dependency:依赖包,一个 module 需要引用的其他 module
一个 module 拥有一个唯一的 module path 以及一个版本号。
go mod 工作原理
go mod 通过 go.mod 文件记录当前 module 的元信息和所有依赖项信息。
然后会自动下载并缓存依赖的包,存放在 GOPATH/pkg/mod 目录。
通过 go mod 管理依赖,就可以很方便地重现相同的依赖环境。
2. 创建 go.mod 文件
go.mod 文件存储在模块根目录,记录了当前模块的元数据,包括模块路径、依赖列表等。
使用 go mod init 来初始化 go.mod 文件
go mod init example.com/module
这会生成一个 go.mod 文件
module example.com/module go 1.17.5
也可以通过 go build、go run 等命令自动创建 go.mod 文件。
3. 查询依赖
使用 go list -m all 可以列出当前 module 的所有依赖
go list -m all
go list -json 可以输出 JSON 格式的数据
go list -json all
使用 go mod graph 可以将依赖图生成 DOT 文件
go mod graph > graph.dot
然后使用 Graphviz 工具生成依赖关系图。
4. 添加依赖
使用 go get 可以下载依赖
go get github.com/gin-gonic/gin
这会自动找到合适的版本并写入 go.mod 文件。
如果需要指定版本可以
go get github.com/x/text@v0.3.0
导入包时,如果发现本地没有该依赖包,也会自动下载。
5. 更新依赖
使用 go get -u 可以升级依赖包到最新的次要版本。
也可以手动修改 go.mod Require 语句指定版本后,
运行 go get 导致更新。
6. 删除依赖
go mod tidy 可以移除不用的依赖项。
也可以直接编辑 go.mod 文件,删除不需要的 module 语句,
然后执行 go mod tidy 重新整理。
7. 代理设置
GO111MODULE 需要设置为 on 才会使用 go mod。
GOPROXY 环境变量控制下载代理
export GOPROXY=https://goproxy.cn
GOPRIVATE 控制不走代理的私有模块。
8. go mod 实战
假设想开发一个 Web 应用程序
mkdir appcd appgo mod init app
这会初始化一个模块。然后可以引入 gin 框架
go get github.com/gin-gonic/gin
这会自动下载 gin 并记录在 go.mod 文件中。
开发过程中,修改 gin 的版本需求
go mod edit -require=github.com/gin-gonic/gin@v1.1.0go get
构建时,执行 go mod tidy 整理依赖。然后就可以构建发布了。
9. go mod 命令参考
go mod download 下载依赖
go mod graph 打印依赖图
go mod init 初始化新模块
go mod edit 编辑 go.mod 文件
go mod tidy 清理依赖
go mod verify 校验依赖
10. go mod 技巧
根据 import 自动添加依赖
删除未使用的依赖
排除具体的依赖
模块代理设置
11. go mod 原理解析
go.mod 使用语义版本规范,可以记录最小和最大版本号。
环境变量控制代理,实现国内代理加速。
go mod 通过元数据和缓存实现可重现的依赖构建。