Go: modules 模块
1 · modules 模块#
模块是Go管理依赖的方式。模块是一组经过版本控制的go 包。
go help modules
1.1 · 2 个重要文件#
- go.mod: 定义当前模块路径、Go 版本、依赖及其版本
- 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#
- github.com/AkihiroSuda/gomodjail 给 Go 第三方依赖加运行时护栏,防止某个 dependency 一旦作恶就直接拿到完整系统能力