当前位置: 首页 > 科技观察

如何正确使用多个版本的Go?

时间:2023-03-16 12:31:12 科技观察

本文转载自微信公众号《围棋编程时间》,作者是写代码的鸣哥。转载本文请联系围棋编程时间公众号。一、需求背景在实际开发中会遇到不同的开源项目,这些项目可能是由不同的团队开发的,使用的go版本不同。以我为例,我目前正在研究KubeVirt(一个可以在K8S下管理虚拟机的开源项目)。为了实现自己的需求,需要对KubeVirt进行二次开发。通过go.mod我们知道KubeVirt是使用go1.13开发的。同时,为了让KubeVirt下的虚拟机使用LVM存储方式,我们引入了阿里自研的lvm-csi插件。同样,这个插件已经实现的功能和我们的预期还是有点距离,所以也需要进行二次开发。查看go.mod,发现lvm-csi是在一个老版本下开发的,即go1.12。同时,我的机器上早就安装了go1.14版本,一直用它来开发。问题来了,如何在我的机器上同时安装这么多版本的golang而不互相冲突呢?2.安装多个版本的Go如果你想让不同版本的go互相不冲突,只要把它们安装在不同的目录下就可以了。首先下载两个版本的安装包$wgethttps://dl.google.com/go/go1.12.linux-amd64.tar.gz$wgethttps://dl.google.com/go/go1.13。linux-amd64.tar.gz分别解压到不同的目录#解压go1.12sudotar-C/tmp/-xzfgo1.12.linux-amd64.tar.gzmv/tmp/go/usr/local/go12#解压go1。13sudotar-C/tmp/-xzfgo1.13.linux-amd64.tar.gzmv/tmp/go/usr/local/go133。简单粗暴的解决方案同一台机器安装多个版本的Golang,需要区分不同版本的goentrySwitch,使用不同的环境变量来区分不同版本的goentry。当你的环境中有多个go时,你在使用gobuild等命令时,系统怎么知道你要使用哪个版本呢?系统不知道,所以需要给不同版本的go起不同的名字。go1.12的go入口改为/usr/local/go12/bin/go12go1.13的go入口改为/usr/local/go13/bin/go13等这样就不会混淆了.$go12versiongoversiongo1.12linux/amd64$go13versiongoversiongo1.13linux/amd64切换使用不同的环境变量,使用不同的go入口,对应的环境变量也需要变量,比如GOROOT,不会随着你使用哪个版本的go自动切换,见下图他们都输出了一个值。$go12envGOROOT/usr/local/go$go13envGOROOT/usr/local/go所以这个不同环境变量之间的切换就得自己动手了。另外需要注意的是:go1.12中没有goenv-w中的-w参数,虽然go1.13中有-w但不能覆盖OS级别的环境变量。您需要在修改前取消设置。知道这几点后,就可以自己实现切换方案了。我想要的解决方案是写一个脚本修改环境变量在/usr/local/go13/bin/$cat</usr/local/go12/bin/goto12unsetGOROOTgoenv-wGOROOT="/usr/local/go12/"EOF$chmod+x/usr/local/go12/bin/goto12下次想使用go1.12时,直接使用如下命令修改环境变量$sourcegoto12go1.13即可。亦是如此,故不敢复述。实现的效果如下:$goenvGOROOT/usr/local/go$sourcegoto12$go12envGOROOT/usr/local/go12$sourcegoto13$go13envGOROOT/usr/local/go134。你应该已经感觉到比上面那个更好的解决方案了。手动sourceswitch还是有点麻烦。其实我有更好的办法。这种方案不需要改go入口的名字,甚至不需要source。只需执行以下两个条件命令(每个版本两个,两个版本四个)$cat</usr/local/go12/bin/go12unsetGOROOTgoenv-wGOROOT="/usr/local/go12/"/usr/local/go12/bin/go$@EOF$chmod+/usr/local/go12/bin/go12$cat</usr/local/go13/bin/go13unsetGOROOTgoenv-wGOROOT="/usr/local/go13/"/usr/local/go13/bin/go$@EOF$chmod+/usr/local/go13/bin/go13来了,执行go12的时候会自动修改go12的环境变量,执行go13会自动修改go13的环境变量,不会影响默认的go行为。当然,我上面只是改了GOROOT环境变量。如果不同的go版本还有其他差异,可以继续在go12或者go13中添加相应的shell代码。