弃用和收回之间的区别?

Difference between Deprecate and retract?

今天我升级到 Go 1.17。 https://golang.org/doc/go1.17 的发行说明讨论了这个新功能:

Module authors may deprecate a module by adding a // Deprecated: comment to go.mod

我从 Go 1.16 知道 go.mod 文件可以指定 retract 指令并收回模块版本或更多版本。

// Deprecated评论的用法与retract类似。请你正式解释一下什么时候应该使用 // Deprecate 什么时候使用 retract?

您应该使用 // Deprecated: comment 表示您不再支持 主要 版本。例如,您发布了 v2.0.0,并且您不打算再在 v1.0.0 上工作。 v1.0.0 可能仍会按预期工作,但它可能缺少许多您只想添加到 v2.0.0 的新功能。

retract 可用于标记可能包含严重错误或漏洞且不应使用的次要版本或补丁版本(或包含在 [ ] 中的一系列版本)。例如,您可能发布了 v1.2.0,但 2 天后有人发现其中存在安全漏洞。您可以修改 go.mod 以将 retract 添加到版本 v1.2.0,并将此添加标记为 v1.2.1:

retract (
    v1.2.0 // Security vulnerability discovered.
    v1.2.1 // Contains retractions only.
    [v3.0.0, v3.9.9] // Retract all from v3
)

这将通知 go 工具不要升级到 v1.2.0v1.2.1(例如,当您使用 go get example.com/m@latest 指示更新到最新版本时)。当您修复问题并发布 v1.2.2 后,go get example.com/m@latest 将更新为 v1.2.2


引用自Go Modules Reference: Deprecation:

Deprecation messages are intended to inform users that the module is no longer supported and to provide migration instructions, for example, to the latest major version. Individual minor and patch versions cannot be deprecated; retract may be more appropriate for that.

并引用自 retract directive:

A retract directive indicates that a version or range of versions of the module defined by go.mod should not be depended upon. A retract directive is useful when a version was published prematurely or a severe problem was discovered after the version was published. Retracted versions should remain available in version control repositories and on module proxies to ensure that builds that depend on them are not broken.