本文转载自微信公众号《我的大脑是炸鱼》,作者陈建宇。转载本文请联系脑筋急转弯公众号。大家好,我是学炸鱼的建宇。Go日前正式发布了1.16版本。从这个版本开始,环境变量GO111MODULE的默认值正式改为on。这也意味着Gomodules将进一步提升其业务覆盖面。对于新旧工程并存的,建议手动将GO111MODULE调成auto。Go1.16发布了Gomodules的新特性,让维护第三方库(需要Gomod)的开发者有反复吃“后悔药”的权利,可以提醒用户发布的“脏”有问题"版本并了解原因。这个新特性对于很多维护和使用公共库(开源、企业等)的小伙伴来说简直是福音,建议大家要了解这个知识点。在下一篇文章中会详细介绍。后悔药:gomodretractGo1.16可以使用go.mod文件中的retract命令声明第三方模块的某些release版本不能被其他模块使用。使用场景方面:模块维护作者在发现严重问题或无意发布某些版本后,可以撤版本,支持单版本或多版本撤版本。之前没有办法解决,所以一旦出现就很麻烦。两者对应的操作如下:Maintainer:删除问题版本的tag。重新标记新版本。用户:发现问题版本标签缺失,需要人工干预。不知道有没有问题,因为依赖其他库,所以被动升级,踩了坑。所以这次Go1.16发布后,新增了半止损的方法,也可以作为Gomod自动更新这个大坑的补充方法之一。实战练习为了方便演示,先创建一个Demo工程(github.com/eddycjy/go-retract-demo),其中包含一个基本方法:packagego_retract_demofuncHelloWorld()string{return"001:Brainfriedfish!"}中另外一个应用项目依赖第三方库,代码如下:funcmain(){//importdemo"github.com/eddycjy/go-retract-demo"s:=demo.HelloWorld()fmt.Println(s)}对应的go.mod文件如下:modulegithub.com/eddycjy/awesomeProjectgo1.16requiregithub.com/eddycjy/go-retract-demov0.0.1retract功能演示但是随着时间的推移,第三方开源库eddycjy/go-retract-demo很快会迭代到v0.3.0的时候,发现之前的v0.2.0有bug。v0.3.0版本紧急修复并提醒该bug。这时候可以在go.mod文件中写retract命令:modulegithub.com/eddycjy/go-retract-demogo1.16//因为不小心打错了fish...上面的retractv0.2.0命令就是这个原因对于提现,以下是具体版本。如果涉及多个版本,可以这样写:retract(v0.1.0v0.2.0)retractfeatureeffect最新版本v0.3.0发布成功后指定retract。对于所有引用这个库的工程应用,执行golist可以看到如下提示:$go1.16list-m-uallxxx/eddycjy/awesomeProjectxxx/eddycjy/go-retract-demov0.2.0(retracted)[v0.3.0]这个命令我们日常使用的IDE(例如:GoLand),在保存的时候会默认执行golist命令。后续IDE支持后,编码时可以快速找到有问题的版本和提示。手动执行goget也会出现警告提示,并显示go.mod文件中的原因注释:$go1.16getgithub.com/eddycjy/go-retract-demo@v0.2.0go:warning:github。com/eddycjy/go-retract-demo@v0.2.0:retractedbymoduleauthor:因为炸鱼不小心打错了...go:toswitchtothelatestunretractedversion,run:gogetgithub.com/eddycjy/go-retract-demo@latest这样可以看到是非常直观的是哪个模块依赖于它,为什么需要撤回。总结一下,以前出现问题后,每个人都需要去问维护者或者看GitHubCommits,总是很麻烦,而且很可能半小时后就消失了。新特性为软缩版本的Gomodules提供了方法,可以给开发者提供更直观的反馈,结合日常开发工具使用更美观。但目前该功能的全面应用受阻:国产模块代理:国产模块代理需要支持retract,否则即使更新版本也没有提示处理。IDE:IDE提供了一些对retract的支持,比如:文本颜色标记为红色、黄色等,方便开发者更好的识别。大家对Gomodules的retract特性有什么看法,欢迎留言讨论!
