第三十二回:Go Modules

华府的库房管理(依赖管理)
华夫人
华夫人: 华府上下几百口人,吃穿用度(代码依赖)都要记在账本上,绝不能乱。Go 语言的项目依赖,必须用 Go Modules 来管理。
唐伯虎
唐伯虎: 夫人英明!以前没有账本的时候(GOPATH 时代),所有东西都堆在一起,乱七八糟。现在有了 go.mod,每个项目都清清楚楚。

📦 第一步:立账本 (go.mod)

go.mod 文件就是项目的总账本,记录了项目用了哪些第三方库(包)及其版本。

还有个 go.sum,它是防伪标记(校验和),确保下载的包没有被掉包(防止中间人攻击)。

🚀 第二步:开张 (初始化)

开始一个新项目时,先初始化。名字通常是代码仓库的地址。

go mod init github.com/tangbohu/qiuxiang

这会生成一个 go.mod 文件。

🛒 第三步:进货 (添加依赖)

当你 import 一个新包并运行 go getgo build 时,Go 会自动下载并记录在案。

# 下载 gin 框架
go get github.com/gin-gonic/gin

# 指定版本(买特定年份的酒)
go get github.com/gin-gonic/gin@v1.9.0

# 升级所有依赖到最新 minor 版本
go get -u ./...

🧹 第四步:查账 (整理依赖)

清理没用的依赖,下载缺少的依赖。每次提交代码前都要运行一下,保持账本干净。

go mod tidy

🔄 第五步:偷天换日 (replace)

有时候需要临时修改第三方库,或者用本地的代码替换远程的(比如国内访问不了某些包),可以用 replace 指令。

// go.mod 文件内容示例
module myproject

go 1.20

require (
    github.com/google/uuid v1.3.0
)

// 把 google.golang.org/grpc 替换为 github.com/grpc/grpc-go
replace google.golang.org/grpc => github.com/grpc/grpc-go v1.38.0

🕵️‍♂️ 第六步:追根溯源 (why & graph)

想知道为什么要引入某个包?

# 为什么要用这个包?
go mod why github.com/stretchr/testify

# 打印所有依赖关系图
go mod graph

📦 第七步:私有库房 (vendor)

把所有依赖的源码都下载到项目目录下的 vendor 文件夹里,即使断网也能编译。

go mod vendor

🎯 练功房(初始化)

在命令行初始化一个名为 tang-fu 的模块。

命令: go mod ______ tang-fu

答案: init