Go 1.16:在 Go 模块中撤回版本

发布: (2026年1月11日 GMT+8 23:59)
4 min read
原文: Dev.to

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

什么是撤回?

撤回将特定的模块版本标记为 已撤回,表示这些版本不应再被使用,因为它们包含问题。

为什么需要撤回?

典型场景:

  1. 在版本发布并被他人使用后发现关键 bug
  2. 发布了错误的版本号(例如,误将 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 后,你想撤回该版本。

  1. 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
  2. 提交并打上新标签(例如 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
  3. 当有人尝试获取被撤回的版本时会看到警告

    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 getgo list 或类似命令查询模块时被获取。

相关学习资源

Back to Blog

相关文章

阅读更多 »

Go.sum 不是锁文件

文章 URL: https://words.filippo.io/gosum/ 评论 URL: https://news.ycombinator.com/item?id=46537095 得分: 17 评论: 4

Go的秘密生活:并发

将混乱的 race condition 变得有序。第15章:通过通信共享。那天星期二档案异常嘈杂。不是来自声音,而是来自 t...