简洁的Go多版本管理机制
动态编程语言必须不断发展伴随着Go项目的不断发展,每个大版本都会有很多小版本的迭代对于Go的版本更新,应该如何做好多版本管理
多版本管理的重要性
以下是我们需要Go多版本管理的几个原因。
稳定性考虑:虽然Go1一直很好地遵循了向后兼容准则,但基于稳定性考虑,我们通常不会直接升级到最新版本。
多项目开发:每个项目依赖的Go版本不一致。
版本兼容性:测试前后代码的兼容性,或者保证不同Go版本中bug修复的正确性对于开源项目,保证版本兼容性非常重要
如何管理多个版本。
我们需要两个前提条件。
已经安装了某个版本的Go。
Git已安装。
固定
通过包装器,下载一个特定的Go版本及其对应的工具链。
$ goltversiongt下载
比如安装1.14.12版本,可以这样做。
使用
使用包装器go1.14.12,我们可以基于GO v1.14.12进行构建和测试。
$ go 1 . 14 . 12 modinithellogo:creating newgo . mod:module hello $ echo ' package main,导入fmt,funcmainfmtPrintln ' Hello . go $ go 1 . 14 . 12 build $
当然,如果你想让go v1.14.12喧宾夺主,成为go命令的代言人,你也可以这么做。
$ goversiongoversiongo 1.17 Darwin/64 $ exportGOROOT = $ $ export PATH = $ go root/bin:$ PATH $ goversiongoversiongo 1 . 14 . 12 Darwin/64
go1.14.12 env GOROOT路径是Go v1.14.12版本的内容所以,如果我们想卸载这个版本,只需删除路径文件夹,要阅读这个版本的源代码,只需查看这个路径下的src/content即可
获取最新的开发版本。
有一个特殊的版本标签:gotip,用来安装最新的开发版本。
可以看到目前拉的最新开发版本是go1.18—1afa432。
实现理念
查看仓库代码,我们可以看到一系列版本目录。
选择任意一个版本进入,就会找到一个main.go文件。
main.go文件如下所示
所以我们后续通过go1.14.12包装器下载运行的逻辑在于内部/版本包中的run方法。
//Run运行 " Go " toolofteproviderversion . func runlog . set flags//获取Go安装目录根目录,err:=gorootiferr!= nillog.fatalf //执行goltversiongt逻辑iflen2 amp,amposargs " download " iferr:= install,呃!= nillog.fatalf OS . exit//确定本版本Go的安装状态if _,err:= OS . stat),呃!= nillog.fatalf ( "%s:未下载
由于篇幅原因,下载的安装并运行runGo函数逻辑本文就不讨论了,想了解更多的同学可以自行探究。
另外,为了让每个版本都有一个Go wrapper主程序,这里使用了一个帮助命令genv:可以快速生成相应版本的wrapper代码lt,versiongt/main.go .这里的实现见internal/genv/main.go代码。
摘要
介绍Go官方提供的多版本管理方案,包括使用,安装,卸载等,我们可以感受到它的简单和高效同时,我们简单地看了一下这组代码逻辑
最后,希望本文能帮助你用好Go多版本管理。
声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多企业信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。投资有风险,需谨慎。