Go 1.16:在 Go 模块中撤回版本
Source: Dev.to

前言
Go Modules 在 Go 1.11 中正式引入,并且从 Go 1.16 起默认启用。当一个包已经发布后,你可能会遇到以下情况:
- 发现已发布版本存在严重问题,想要阻止他人继续使用。
- 不小心发布了错误的版本号(例如,将
v1.0.0误发布为原本想要的v0.4.0)。
如果该包已经被分发出去,你需要 模块版本撤回(module version retraction)来告知用户问题并阻止后续使用该有问题的版本。
本文阐述了在 Go 1.16 中新增的(仍未广泛宣传的)撤回功能,并演示如何使用它。
TL;DR
什么是撤回?
撤回将特定的模块版本标记为 已撤回,表示这些版本不应再被使用,因为它们包含问题。
为什么需要撤回?
典型场景:
- 在版本发布并被他人使用后发现关键 bug。
- 发布了错误的版本号(例如,误将
v0.4.0发布为v1.0.0),导致其他项目依赖了错误的版本。
撤回让模块作者能够通过 go get/go list 直接向用户传达这些问题。
之前是如何处理撤回的
在 Go 1.16 之前,没有内置的撤回机制。作者只能在 README 中添加说明,但 go get 无法自动展示这些信息。
如何使用 Go Modules 撤回
下面的示例遵循官方 Go Playground 演示。
问题 1:在已发布的版本中发现严重问题
假设你维护模块 gopher.live/ue0ddd4a99c02/proverb,已经发布了 v0.2.0。在发现严重 bug 后,你想撤回该版本。
-
向
go.mod添加 retract 指令:go mod edit -retract=v0.2.0此时
go.mod如下:module gopher.live/ue0ddd4a99c02/proverb go 1.16 // Go proverb was totally wrong retract v0.2.0 -
提交并打上新标签(例如
v0.3.0):git add -A git commit -m "Fix severe error in Go proverb" git push origin main git tag v0.3.0 git push origin v0.3.0 -
当有人尝试获取被撤回的版本时会看到警告:
go get gopher.live/ue0ddd4a99c02/proverb@v0.2.0 go: warning: gopher.live/ue0ddd4a99c02/proverb@v0.2.0: retracted by module author: Go proverb was totally wrong go: to switch to the latest unretracted version, run: go get gopher.live/ue0ddd4a99c02/proverb@latest go get: downgraded gopher.live/ue0ddd4a99c02/proverb v0.3.0 => v0.2.0警告明确指出
v0.2.0不应再被使用,并引导用户切换到最新的未撤回版本。
相关问题
- 我需要运行
go get(或go list)才能看到撤回信息吗?
是的。撤回元数据会在通过go get、go list或类似命令查询模块时被获取。