简洁的Go多版本管理机制

2022-09-24 02:58

  

一门充满生机的编程语言,一定是不断进化向前的。随着 Go 项目的持续发展,而且每个大版本内还会有不少小版本的迭代。对于 Go 的版本更新,我们该如何做好多版本管理。

  多版本管理的重要性

这里简单列举几个我们需要 Go 多版本管理的理由。

  

稳定性考量:虽然 Go1 一直在良好地遵守向后兼容准则,但通常基于稳定性考虑,我们并不会直接升级到最新版本。

  

多项目开发:各项目依赖的 Go 版本不一致。

  

版本兼容:测试代码前后兼容性,或者确保 bug 修复在不同 Go 版本的正确性,对于开源项目,保证版本兼容性非常重要。

  如何多版本管理

我们需要有两个先决条件

  

已经安装好了某版本的 Go

  

安装好了 git

  

安装

  

运行 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,我们可以基于 Go v1。14。12 进行构建和测试。

  $go1。14。12modinithello go!creatingnewgo。mod!modulehello $echopackagemain;importfmt;funcmain(){fmt。Println(Hello,World)}hello。go $go1。14。12build $。/hello Hello,World

当然,如果你想让 Go v1。14。12 ”喧宾夺主“,成为 go 命令的代言人,可以这样做。

  $goversion goversiongo1。17darwin/64 $exportGOROOT=$(go1。14。12envGOROOT) $exportPATH=${GOROOT}/bin!$PATH $goversion goversiongo1。14。12darwin/64

这个 go1。14。12 env GOROOT 路径就是 Go v1。14。12 版本的内容。所以,如果我们想卸载这个版本,直接将该路径文件夹删除即可;想阅读该版本源码,直接查看该路径下的 src/ 内容即可 。

  

获取最新开发版本

  

有一个特别的版本标记:gotip,它用于安装最新的开发版本。

  $goinstallgolang。org/dl/gotip@latest $gotipdownload

可以看到,当前拉取到的最新的开发版本是 go1。18-1afa432。

  

  实现思路

实现多版本下载安装的秘诀就在于 dl 这个仓库, golang / dl 是它的镜像库。

  

查看仓库代码,我们能看到一系列版本目录

  

  

随意选择一个版本进入,会发现存在一个 main。go 文件

  

  

而 main。go 文件内容如下

  

  

我们通过 dl / go1。14。12@latest 下载的 go1。14。12 包装器就是这个 main。go 编译而成。

  

因此,我们后续通过 go1。14。12 包装器下载和运行的逻辑就在于 internal / version 包中的 Run 方法了。

  //RunrunsthegotooloftheprovidedGoversion。 funcRun(versionstring){ log。SetFlags(0) //获取Go安装目录 root,err!=goroot(version) iferr!=nil{ log。Fatalf(%s!%v,version,err) } //执行go<;version>;download命令时逻辑 iflen(os。Args)==2os。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%sdownloadtoinstallto%v,version,version,root) } //运行该版本Go runGo(root) }

鉴于篇幅原因,下载的 install 和运行的 runGo 函数逻辑本文就不再展开了,想深入了解的同学可以自行探索。

  

另外,为了让每个版本都有一个 Go 包装器主程序(避免重复的手工操作),这里使用了一个帮助命令 genv:可以快速生成对应版本的包装器代码 <;version>;/main。go。这里的实现见 internal / genv / main。go 代码。

  总结

本文介绍了 Go 提供的多版本管理方案,包括使用、安装、卸载等,可以感受到它的简洁与高效。同时我们简单查看了这一套实现代码逻辑。

  

最后,希望本文内容能够助你用好 Go 多版本管理。

  

本文来自微信公众号:Golang 技术分享 (ID:GolangShare),作者:机器铃砍菜刀

上一篇:SensorTower:8月抖音及TikTok蝉联非游戏移动应用榜冠军
下一篇:[图]22种选择:你会购买AppleWatch哪个版本?
图文资讯
返回顶部小火箭