Skip to main content

Go: modules 模块

📅 2026-02-05 ✏️ 2026-03-20 Inside Go CS GO

1 · modules 模块#

https://go.dev/ref/mod

模块是Go管理依赖的方式。模块是一组经过版本控制的go 包

go help modules

1.1 · 2 个重要文件#

  1. go.mod: 定义当前模块路径、Go 版本、依赖及其版本
  2. go.sum: 记录依赖的校验和,保证构建可复现
module example.com/my/project   // 模块路径

go 1.21                         // 当前模块要求的最低 Go 版本

require (
    golang.org/x/net v0.5.0     // 直接依赖
    github.com/xxx v1.2.3       // indirect // 间接依赖
)

一个moudule路径通常由repo的根路径,repo中的一个目录,一个主要version后缀组成。

1.2 · 版本化 version#

version, 标识了模块的一个不可变的快照,由字母v开头且后接语义化版本号

1.2.1 · 伪版本号

通过vcs获取模块时,可以使用伪版本号比如git提交hash和时间戳

伪版本号有三个部分,基本的版本前缀(来源于repo的语义tag或没有此样的tag就为vX.0.0; 时间戳(yyyymmddhhmmss),修订创建的UTC时间,git中是提交的时间;修订标识符,git提交hash的前12个字符,或svn中0填充的修订数据。

三种格式:确保比基础版本号更高但低于下一个标记的版本号 vX.0.0-yyyymmddhhmmss-abcdefabcdef 未知的基本版本号 vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef 基础版本号是一个预发布版本 vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef 基础版本号是一个已发布版本

主要版本后缀,模块路径在主要版本1的时候example.com/mod,那在版本2的时候路径必须为example.com/mod/v2 如果新旧包有着相同的导入路径,那么新包必须向后兼容旧包;

1.3 · 管理模块

日常依赖管理(添加、删除、升级、降级),使用go get

go mod # 对模块进行操作
go help mod

1.4 · 指令

1.4.1 · require#

声明依赖模块及其最低版本,可加 // indirect 表示间接依赖

1.4.2 · replace#

用本地路径或其他模块替换指定模块(仅主模块生效)

1.4.3 · exclude#

排除某个模块的某个版本(go改用更高版本),使其不被加载(仅主模块生效)

1.4.4 · retract#

撤回当前模块发布的版本:声明发布的某个(或某段)版本不应被新项目依赖,用于“撤回”有问题的发布

会解析到未被撤回的最高版本

1.4.5 · tool#

将包声明为工具依赖,可通过 go tool 运行

2 · links#

  1. github.com/AkihiroSuda/gomodjail 给 Go 第三方依赖加运行时护栏,防止某个 dependency 一旦作恶就直接拿到完整系统能力