乐趣区

关于golang:Go116-新特性Go-mod-的后悔药仅需这一招

若有任何问题或倡议,欢送及时交换和碰撞。我的公众号是【脑子进煎鱼了】,GitHub 地址:https://github.com/eddycjy。

大家好,我是煎鱼。

前几天 Go 官网正式公布了 1.16 版本。从这个版本起,环境变量 GO111MODULE 的默认值正式批改为 on

这也意味着 Go modules 将更进一步推动其业务覆盖面,有新老我的项目共存的小伙伴倡议手动将 GO111MODULE 调整为 auto。

Go1.16 针对 Go modules 放出了一个新个性,可能让保护 Go mod 库的开发者领有重复吃“后悔药”的势力,揭示开发者已公布的“脏”版本存在问题

这个新个性,对于许多保护和应用公共库(开源、企业等)的小伙伴几乎是一个小福音,倡议大家都应该要理解这个知识点。

在接下来文章中将进行具体阐明和介绍。

后悔药:Go mod retract

Go1.16 起能够在 go.mod 文件中应用 retract 指令来申明该第三方模块的某些发行版本不能被其余模块应用。

在应用场景上:在发现重大问题或无心公布某些版本后,模块的保护作者能够撤回该版本,反对撤回单个或多个版本。

以前没有方法解决,因而一旦呈现就十分麻烦。对应两者的操作如下:

  • 维护者:

    • 删除有问题版本的 tag。
    • 从新打一个新版本的 tag。
  • 使用者:

    • 发现有问题的版本 tag 失落,需手动染指。
    • 不晓得有问题,因为其余库依赖,因而被动降级而踩坑。

因而在本次 Go1.16 公布后,就领有了一个 半止损 的新伎俩了,也能够作为 Go mod 自动更新的大坑的补全方法之一。

实战演练

为了不便演示,首先创立一个 Demo 我的项目(github.com/eddycjy/go-retract-demo),其含有一个根底办法:

package go_retract_demo

func HelloWorld() string {return "001:脑子进煎鱼了!"}

另外有一个利用工程依赖了该第三方库,代码如下:

func main() {
  // import demo "github.com/eddycjy/go-retract-demo"
    s := demo.HelloWorld()
    fmt.Println(s)
}

对应的 go.mod 文件如下:

module github.com/eddycjy/awesomeProject

go 1.16

require github.com/eddycjy/go-retract-demo v0.0.1

retract 个性演示

但随着工夫一直推移,第三方开源库 eddycjy/go-retract-demo 行将迭代到 v0.3.0 时,发现以往的 v0.2.0 是有 BUG 的。

须要紧急的在v0.3.0 版本把这个 BUG 修复并揭示进来。此时能够在 go.mod 文件中写入 retract 指令:

module github.com/eddycjy/go-retract-demo

go 1.16

// 因为煎鱼不小心敲错了...
retract v0.2.0

指令下面为撤回的起因,前面是具体的版本。如果波及多版本,能够如下编写:

retract (
  v0.1.0
  v0.2.0
)

retract 个性成果

胜利公布最新版本 v0.3.0 版本并指定 retract 后。
所有援用了该库的工程利用,执行 go list 就能够看到如下揭示:

$ go1.16 list -m -u all
github.com/eddycjy/awesomeProject
github.com/eddycjy/go-retract-demo v0.2.0 (retracted) [v0.3.0]

联合该命令,咱们日常应用的 IDE(例如:GoLand),其在保留时是会默认执行 go list 命令的。在后续 IDE 反对后,就能够在编码时就疾速发现有问题的版本和提醒

在手动执行 go get 时也会呈现 warning 提醒,会把 go.mod 文件上的起因正文显示进去:

$ go1.16 get github.com/eddycjy/go-retract-demo@v0.2.0
go: warning: github.com/eddycjy/go-retract-demo@v0.2.0: retracted by module author: 因为煎鱼不小心敲错了...
go: to switch to the latest unretracted version, run:
    go get github.com/eddycjy/go-retract-demo@latest

这样就能看到是哪个模块依赖,因为什么起因要求撤回了,十分直观。

总结

以往在出问题后每个个体须要跑去问维护者或者看 GitHub Commits,那样总归十分麻烦,很可能一来一回半个钟就没了。

新个性给予了 Go modules 软撤回版本的一个办法,可能把问题更直观的反馈到开发者的手中,再联合日常开发工具的话更是美哉。

但这个个性的齐全利用目前也是有肯定的妨碍的:

  • 国内模块代理:须要国内的模块代理也反对 retract,否则即便你更新了版本也没有提醒解决
  • IDE:IDE 针对 retract 做一些反对,例如:文字色彩标红、黄等,可能便于开发者更好的辨认。

你对 Go modules 的 retract 个性怎么看,欢送一起留言探讨!

我的公众号

分享 Go 语言、微服务架构和奇怪的零碎设计,欢送大家关注我的公众号和我进行交换和沟通。

最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。

退出移动版