Content #
从 Go 1.16 版本开始,Go Module 作者还可以在 go.mod 中使用新增加的 retract 指示符,标识出哪些版本是作废的且不推荐使用的。retract 的语法形式如下:
// go.mod
retract v1.0.0 // 作废v1.0.0版本
retract [v1.1.0, v1.2.0] // 作废v1.1.0和v1.2.0两个版本
m1 module 已经演进到v1.0.1版本,某天不小心发布了还处于broken状态的 v1.0.2版本,已经有用户将其拉到proxy缓存中。我们可以将 m1 的 go.mod 更新为如下内容:
//m1的go.mod
module bitbucket.org/bigwhite/m1
go 1.17
retract v1.0.2
然后将 m1 放入 v1.0.3 标签中并发布。现在 m1 的消费者 c2 要查看 m1 是否有最新版本时,可以查看到以下内容(c2 本地环境使用 go1.17 版本):
$GONOPROXY=bitbucket.org/bigwhite/m1 go list -m -u all
... ...
bitbucket.org/bigwhite/m1 v1.0.2 (retracted) [v1.0.3]
从 go list 的输出结果中,我们看到了 v1.0.2 版本上有了 retracted 的提示,提示这个版本已经被 m1 的作者作废了,不应该再使用,应升级为 v1.0.3。
但 retracted 仅仅是一个提示作用,并不影响 go build 的结果,c2 环境(之前在 go.mod 中依赖 m1 的 v1.0.2)下的 go build 不会自动绕过 v1.0.2,除非显式更新到 v1.0.3。