Go Modules 依赖管理
Go Modules(模块)是 Go 官方自 1.11 起提供、1.16 起默认开启的依赖管理方案。一个项目只要在根目录有 go.mod 文件就是一个模块:go.mod 记录模块名、Go 版本和第三方依赖清单;go.sum 记录每个依赖的校验和,防止依赖被篡改。这是 Go 项目最标准的组织与依赖管理方式。
概念:module、go.mod、go.sum
- module:一组相关包的集合,通常等于一个代码仓库/项目。
- go.mod:模块的"身份证",写清模块名、Go 版本、require 的依赖及版本。
- go.sum:依赖内容哈希的清单,交给版本控制提交,构建时用于校验。
go mod init:初始化模块
在一个新项目目录里运行 init 并指定模块名,就会生成 go.mod:
go mod init myapp
生成的 go.mod 大致长这样:
module myapp // 模块名,发布用可带域名,如 example.com/myapp
go 1.21 // 需要的 Go 版本
require github.com/gin-gonic/gin v1.9.1 // 依赖及精确版本
go get:安装依赖与指定版本
代码里 import 了第三方包之后,用 go get 下载并写入 go.mod:
go get github.com/gin-gonic/gin // 装最新版本
go get github.com/gin-gonic/gin@v1.9.1 // 指定精确版本
go get github.com/gin-gonic/gin@latest // 明确要最新
go mod tidy:整理依赖
删掉不再用的包、或引入新包后,运行 tidy 自动增删 go.mod 里的依赖并同步 go.sum,是日常最常用的"打扫"命令:
go mod tidy
与 go run / go build 配合
模块化后,构建会自动读取 go.mod 下载依赖,多数时候不需要手动 go get:
go run main.go // 直接运行:自动解析并下载依赖
go build -o app . // 编译当前模块,产出可执行文件 app
GOPROXY:配置国内代理
默认从 Google 服务器拉依赖,国内网络经常失败。推荐用国内代理 goproxy.cn,一条命令永久生效:
go env -w GOPROXY=https://goproxy.cn,direct
direct 表示代理拉不到时回退直连源站。之后 go get、go build、go mod tidy 都会自动走该代理。
vendor 与私有依赖
vendor 一句话:执行 go mod vendor 会把依赖源码拷贝进项目 vendor 目录并随代码提交,之后 go build -mod=vendor 可完全离线构建。私有依赖一句话:公司内网的私有模块可用 go env -w GOPRIVATE=gitlab.example.com 指定,使这些仓库跳过代理并关闭公共校验和检查。
小结:go.mod/go.sum 是模块的依赖档案,init 创建、go get 安装、go mod tidy 整理;国内请先 go env -w GOPROXY=https://goproxy.cn,direct,需要离线时用 vendor,私有仓库用 GOPRIVATE。