依赖管理
本教程共 80 篇 · 第 68 篇 · 更新于 2026-07-27 · 约 8 分钟阅读
68. 依赖管理
本节目标:学会用
go get添加依赖、go mod tidy整理依赖,看懂 go.sum 校验文件,理解 MVS 版本选择机制。
添加依赖
直接在代码里 import 一个新包,然后跑 go mod tidy,Go 会自动帮你下载并写入 go.mod:
import "github.com/google/uuid"
go mod tidy
也可以用 go get 显式指定:
go get github.com/google/uuid # 最新版本
go get github.com/google/uuid@v1.6.0 # 指定版本
go get github.com/google/uuid@latest # 最新
go get github.com/google/uuid@main # 某个分支
go get vs go mod tidy
两者有分工:
go get:主动添加或升级某个依赖,会修改 go.modgo mod tidy:根据代码实际 import 情况,补全缺失依赖、删除没用的
日常流程:
- 写代码,import 新包
- 跑
go mod tidy,依赖自动加进来 - 想升级某个依赖,用
go get pkg@latest
go get 只管依赖
WarningGo 1.18 起,
go get不再负责安装可执行程序,只管理 go.mod 里的依赖。装工具用go install,下一节细讲。老教程里go get -u装二进制的方式已经过时。
升级和降级
# 升级到最新
go get github.com/google/uuid@latest
# 升级所有依赖到最新的次版本
go get -u ./...
# 降级到旧版本
go get github.com/google/uuid@v1.5.0
# 升级到某个大版本(不兼容升级)
go get github.com/some/lib/v2@latest
Note大版本升级(v1 到 v2)import 路径会变。v2 及以上要在路径加版本号:
github.com/some/lib/v2。
go.sum 校验文件
go.sum 记录每个依赖的哈希值,用来校验下载的代码没被篡改:
github.com/google/uuid v1.6.0 h1:NI...
github.com/google/uuid v1.6.0/go.mod h1:OE...
每次 go mod tidy 或 go get 都会更新 go.sum。提交代码时 go.mod 和 go.sum 要一起提交。
Tip如果同事拉代码后报哈希校验失败,多半是依赖被改过或缓存坏了。跑
go clean -modcache清掉缓存重新下载。
MVS 版本选择
Go 用 MVS(Minimal Version Selection,最小版本选择)算法决定用哪个版本的依赖。规则很简单:用所有依赖声明的最低版本中的最高那个。
假设你的项目依赖 A 和 B:
- A 依赖 C v1.2
- B 依赖 C v1.3
那最终用 C v1.3,因为它是「被要求的最高版本」。
MVS 的特点:
- 不像 npm/pip 那样自动跳到最新,用声明版本里最高的
- 结果可复现,go.mod 里写什么就是什么
- 不会出现「不同机器装出不同版本」
indirect 间接依赖
你的代码直接 import 的叫直接依赖。你依赖的库自己 import 的,对你来说是间接依赖:
require (
github.com/google/uuid v1.6.0 // 直接
github.com/stretchr/testify v1.9.0 // 直接
golang.org/x/sys v0.20.0 // indirect // 间接,被上面两个用了
)
go mod tidy 会自动标注 // indirect。你一般不用手动管。
replace 本地替换
开发时常用 replace 把依赖指向本地路径,方便联调:
replace example.com/mylib => ../mylib
这样 import example.com/mylib 会用本地 ../mylib 的代码,不用先发布。
调试完记得删掉 replace,或者用 go work(下一节讲)替代。
查看依赖
go list -m all # 列出所有依赖
go list -m -versions github.com/google/uuid # 查看所有可用版本
go mod why github.com/google/uuid # 为什么需要它
go mod graph # 依赖关系图
go mod why 很实用,能帮你搞清楚某个间接依赖是怎么被引入的。
清理依赖
删掉代码里不再 import 的包后,跑 go mod tidy 会自动从 go.mod 移除对应依赖。不需要手动删 require 行。
小结
- import +
go mod tidy是添加依赖的标准流程 go get pkg@version指定或升级版本go get只管依赖,不装二进制(那是go install的事)- go.sum 记录哈希,保证依赖没被篡改
- MVS 用声明版本中最高的,结果可复现
replace指向本地路径方便联调go mod tidy自动补全、删除、标注 indirect
下一节讲 go install 安装命令行工具。