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。

笔记加载中…