您正在访问亚汇网香港分站,本站所提供的内容均遵守中华人民共和国香港特别行政区法律法规。

简洁的 Go 多版本管理机制

文 / 小亚 2022-09-22 17:00:05 来源:亚汇网

一门充满生机的编程语言,一定是不断进化向前的。随着Go项目的持续发展,它目前已经发布到了1.17大版本,而且每个大版本内还会有不少小版本的迭代。对于Go的版本更新,我们该如何做好多版本管理。多版本管理的重要性这里简单列举几个我们需要Go多版本管理的理由。稳定性考量:虽然Go1一直在良好地遵守向后兼容准则,但通常基于稳定性考虑,我们并不会直接升级到最新版本。多项目开发:各项目依赖的Go版本不一致。版本兼容:测试代码前后兼容性,或者确保bug修复在不同Go版本的正确性,对于开源项目,保证版本兼容性非常重要。学习新特性:例如虽然我们还在使用Go1.16开发,但是并这不能阻碍你尝鲜Go1.17新功能。如何多版本管理我们需要有两个先决条件已经安装好了某版本的Go安装好了git安装运行goinstallgolang.org/dl/go<version>命令将下载特定Go版本的包装器。$goinstallgolang.org/dl/go<version>@latest通过包装器,下载特定Go版本和它对应的工具链。$go<version>download例如安装1.14.12版本,可以这样执行。$goinstallgolang.org/dl/go1.14.12@latest$go1.14.12download使用使用包装器go1.14.12,我们可以基于Gov1.14.12进行构建和测试。$go1.14.12modinithellogo:creatingnewgo.mod:modulehello$echo'packagemain;import"fmt";funcmain(){fmt.Println("Hello,World")}'hello.go$go1.14.12build$./helloHello,World当然,如果你想让Gov1.14.12”喧宾夺主“,成为go命令的代言人,可以这样做。$goversiongoversiongo1.17darwin/64$exportGOROOT=$(go1.14.12envGOROOT)$exportPATH=${GOROOT}/bin:$PATH$goversiongoversiongo1.14.12darwin/64这个go1.14.12envGOROOT路径就是Gov1.14.12版本的内容。所以,如果我们想卸载这个版本,直接将该路径文件夹删除即可;想阅读该版本源码,直接查看该路径下的src/内容即可。获取最新开发版本有一个特别的版本标记:gotip,它用于安装最新的开发版本。$goinstallgolang.org/dl/gotip@latest$gotipdownload可以看到,当前拉取到的最新的开发版本是go1.18-1afa432。实现思路实现多版本下载安装的秘诀就在于https:/go.googlesource.com/dl这个仓库,https:/github.com/golang/dl是它的镜像库。查看仓库代码,我们能看到一系列版本目录随意选择一个版本进入,会发现存在一个main.go文件而main.go文件内容如下我们通过goinstallgolang.org/dl/go1.14.12@latest下载的go1.14.12包装器就是这个main.go编译而成。因此,我们后续通过go1.14.12包装器下载和运行的逻辑就在于internal/version包中的Run方法了。/Runrunsthe"go"tooloftheprovidedGoversion.funcRun(versionstring){log.SetFlags(0)/获取Go安装目录root,err:=goroot(version)iferr!=nil{log.Fatalf("%s:%v",version,err)}/执行go<version>download命令时逻辑iflen(os.Args)==2&&os.Args[1]=="download"{iferr:=install(root,version);err!=nil{log.Fatalf("%s:downloadfailed:%v",version,err)}os.Exit(0)}/判断该版本Go安装状态if_,err:=os.Stat(filepath.Join(root,unpackedOkay));err!=nil{log.Fatalf("%s:notdownloaded.Run'%sdownload'toinstallto%v",version,version,root)}/运行该版本GorunGo(root)}鉴于篇幅原因,下载的install和运行的runGo函数逻辑本文就不再展开了,想深入了解的同学可以自行探索。另外,为了让每个版本都有一个Go包装器主程序(避免重复的手工操作),这里使用了一个帮助命令genv:可以快速生成对应版本的包装器代码<version>/main.go。这里的实现见internal/genv/main.go代码。总结本文介绍了Go官方提供的多版本管理方案,包括使用、安装、卸载等,可以感受到它的简洁与高效。同时我们简单查看了这一套实现代码逻辑。最后,希望本文内容能够助你用好Go多版本管理。本文来自微信公众号:

相关新闻

加载更多...