服务器之家

服务器之家 > 正文

安装了多个版本的 Go,该怎么用才正确?

时间:2021-07-29 00:00     来源/作者:Go编程时光

安装了多个版本的 Go,该怎么用才正确?

1. 需求背景

实际开发中会接触到不同的开源项目,而这些项目有可能是不同团队开发的,使用的 go 版本都是不一样的。

以我为例,最近在研究 KubeVirt (一个能在 K8S 下管理虚拟机的开源项目),为了实现自己的需求,需要对 KubeVirt 进行二次开发。

通过 go.mod 得知 KubeVirt 是使用 go 1.13 开发的,而同时为了能在 KubeVirt 下的虚拟机能使用 LVM 这种存储方式,我们又引入了阿里研发的 lvm-csi 插件,同样的,这个插件已经实现的功能距离我们的预期还有点差距,因此同样要进行二次开发。查看 go.mod 发现,lvm-csi 是在更老的版本下开发的,也就是 go 1.12 。

而同时我的机器上很早之前就安装过 go 1.14 的版本,也一直使用它来开发。

问题就来了,如何让才能在我的机器上能同时安装这么多个版本的 golang ,而且互不冲突呢?

2. 安装多版本的 Go

要想不同版本的 go 互不冲突,只要将他们安装在不同的目录下就可以了。

首先下载两个版本的安装包

  1. $ wget https://dl.google.com/go/go1.12.linux-amd64.tar.gz 
  2. $ wget https://dl.google.com/go/go1.13.linux-amd64.tar.gz 

然后分别解压至不同目录

  1. # 解压go 1.12 
  2. sudo tar -C /tmp/ -xzf go1.12.linux-amd64.tar.gz 
  3. mv /tmp/go /usr/local/go12  
  4.  
  5. # 解压go 1.13 
  6. sudo tar -C /tmp/  -xzf go1.13.linux-amd64.tar.gz 
  7. mv /tmp/go /usr/local/go13 

3. 简单粗暴的方案

在同一台机器中安装多个版本的 Golang 需要注意

  • 区分不同版本的 go 入口
  • 切换使用不同的环境变量

区分不同版本 go 入口

当你在环境中有多个 go ,那么当你使用 go build 等命令时,系统如何知道你想要使用的是哪个版本呢?

系统并不知道,因此你需要为不同版本的 go 起不同的名字

  • go 1.12 的 go 入口就改成 /usr/local/go12/bin/go12
  • go 1.13 的 go 入口就改成 /usr/local/go13/bin/go13
  • 以此类推

如此一来,就不会混淆了

  1. $ go12 version 
  2. go version go1.12 linux/amd64 
  3. $ go13 version 
  4. go version go1.13 linux/amd64 

切换使用不同的环境变量

使用了不同的go入口,对应的环境变量也要变量,比如 GOROOT,它可不会随着你使用哪个版本的 go 就自动切换,看下面他们输出的都是一个值。

  1. $ go12 env GOROOT 
  2. /usr/local/go 
  3. $ go13 env GOROOT 
  4. /usr/local/go 

因此,这个切换不同环境变量得自己来做

另外要注意的是:

  • go 1.12 没有 go env -w 中的 -w 参数
  • go 1.13 中虽然有 -w 但不能覆盖OS级别的环境变量,修改前需先 unset

知道了这几点之后,便可以自行实现切换的方案。

我想的方案是可以在 /usr/local/go13/bin/ 写一个修改环境变量的脚本

  1. $ cat << EOF >/usr/local/go12/bin/goto12 
  2. unset GOROOT 
  3. go env -w GOROOT="/usr/local/go12/" 
  4. EOF 
  5.  
  6. $ chmod +x /usr/local/go12/bin/goto12 

下次要使用 go 1.12 的时候,直接使用下面命令就可以修改环境变量

  1. $ source goto12 

go 1.13 也是同理,不敢赘述。

实现的效果如下

  1. $ go env GOROOT 
  2. /usr/local/go 
  3.  
  4. $ source goto12 
  5. $ go12 env GOROOT 
  6. /usr/local/go12 
  7.  
  8. $source goto13 
  9. $ go13 env GOROOT 
  10. /usr/local/go13 

4. 比上面更优的方案

到这里,你应该已经感受到了,每次切换都要手动 source 一下,还是有点麻烦。

其实我还有一个更好的方法,这种方案,可以不用去改 go 入口的名字,同样连 source 都不用。

只要执行下面两条件命令即可(每个版本两条,两个版本就是四条)

  1. $ cat << EOF >/usr/local/go12/bin/go12 
  2. unset GOROOT 
  3. go env -w GOROOT="/usr/local/go12/" 
  4. /usr/local/go12/bin/go $@ 
  5. EOF 
  6.  
  7. $ chmod + /usr/local/go12/bin/go12 
  8.  
  9. $ cat << EOF >/usr/local/go13/bin/go13 
  10. unset GOROOT 
  11. go env -w GOROOT="/usr/local/go13/" 
  12. /usr/local/go13/bin/go $@ 
  13. EOF 
  14.  
  15. $ chmod + /usr/local/go13/bin/go13 

如果一来,当你执行 go12 就会自动修改 go12 的环境变量,执行 go13 就会自动修改 go13 的环境变量,并且不会影响默认的 go 的行为。

安装了多个版本的 Go,该怎么用才正确?

当然以上我都只改了 GOROOT 这一环境变量,若在不同的 go 版本还有其他不一样的地方,可以继续在 go12 或者go13 中添加对应的 shell 代码。

原文链接:https://mp.weixin.qq.com/s/b4G3xQG4D6NarF_waMpoCw

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部