# 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 互不冲突,只要将他们安装在不同的目录下就可以了。

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

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

然后分别解压至不同目录

# 解压go 1.12
sudo tar -C /tmp/ -xzf go1.12.linux-amd64.tar.gz
mv /tmp/go /usr/local/go12 # 解压go 1.13
sudo tar -C /tmp/  -xzf go1.13.linux-amd64.tar.gz
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

  • 以此类推

如此一来,就不会混淆了

$ go12 version
go version go1.12 linux/amd64
$ go13 version
go version go1.13 linux/amd64

切换使用不同的环境变量

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

$ go12 env GOROOT
/usr/local/go
$ go13 env GOROOT
/usr/local/go

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

另外要注意的是

  1. go 1.12 没有 go env -w 中的 -w 参数

  2. go 1.13 中虽然有 -w 但不能覆盖OS级别的环境变量,修改前需先 unset

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

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

$ cat << EOF >/usr/local/go12/bin/goto12
unset GOROOT
go env -w GOROOT="/usr/local/go12/"
EOF$ chmod +x /usr/local/go12/bin/goto12

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

$ source goto12

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

实现的效果如下

$ go env GOROOT
/usr/local/go$ source goto12
$ go12 env GOROOT
/usr/local/go12$source goto13
$ go13 env GOROOT
/usr/local/go13

# 4. 比上面更优的方案

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

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

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

$ cat << EOF >/usr/local/go12/bin/go12
unset GOROOT
go env -w GOROOT="/usr/local/go12/"
/usr/local/go12/bin/go $@
EOF$ chmod + /usr/local/go12/bin/go12$ cat << EOF >/usr/local/go13/bin/go13
unset GOROOT
go env -w GOROOT="/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 代码。

本文转载自公众号「Go编程时光」,如需转载请点击下方名片联系号主。

- END -

扫码关注公众号「网管叨bi叨」

给网管个星标,第一时间吸我的知识 

电脑安装了多个版本的 Go,怎么优雅切换各个使用版本?相关推荐

  1. java 安装多版本_一台电脑安装多个版本的jdk

    一台电脑安装多个版本的jdk 我们平时在做Java开发的时候,有时需要使用多个版本的jdk, 那么一台电脑上需要安装多个JDK了. 那一台电脑上可不可以同时安装多个版本的jdk呢? 答案是可以的! 但 ...

  2. 同一个电脑安装两个jdk版本

    同一个电脑安装两个jdk版本场景:公司项目使用的jdk为1.7,最近不是很忙,学习scala.该系统使用到了jdk1.8的特性,所以I need 俩版本,开整!!! 1 . 准备两个版本的jdk我的两 ...

  3. 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...

    在电脑系统安装游戏的过程中遇到一些问题,导致无法正常安装游戏程序.在安装过程中,出现提示"此文件版本与正在运行Windows不兼容",对于这样的问题,我们应该如何进行解决呢?下面驱 ...

  4. 非华为电脑安装电脑管家进行多屏协同提示驱动版本过低的解决方法

    遇到问题 参照大佬的博客,我们在一台非华为电脑上成功装上了华为电脑管家,这样就可以多屏协同了. 非华为电脑安装电脑管家最新版11多屏协同 配合淘宝买的NFC贴纸连接电脑就方便了很多.但是想连接平板作为 ...

  5. 查询当前电脑安装的Java/JDK版本的方法(查看Java/JRE版本号)

    查看当前电脑安装的Java/JDK版本的方法 1.电脑键盘同时按住Windows+R按键,弹出运行程序,输入cmd并确定 2.在黑框控制台中输入java --version,即可查看Java版本号 3 ...

  6. 非华为电脑安装移动应用引擎1.6版本教程

    [安装助手]非华为电脑安装移动应用引擎1.6版本教程

  7. 一台电脑安装多个版本的MySQL数据库

    电脑安装多个版本的MySQL数据库 相关信息 系统:windows10环境 背景:因为工作所需,故此安装多个版本的MySQL数据库 参考链接: https://blog.csdn.net/weixin ...

  8. 因为计算机安装了更新i,电脑安装iTunes时提示这台电脑已安装了更高版本的解决方法图文教程...

    最近有用户在电脑中安装iTunes软件时,出现了提示"这台电脑已安装了更高版本的Apple Software Update",如果遇到了这样的问题,这该怎么办呢?下面脚本之家的小编 ...

  9. 同一个电脑可安装多个python版本吗_同一台电脑安装不同版本的python(python2.7和python3.7)...

    先安装的是python2.7 而后又安装的python3.7版本,如同python2.7升级后,也自带这pip,所以就不用像网上那么麻烦. 第一步 安装python2.7,选择增加到环境变量==> ...

最新文章

  1. Python_模块介绍
  2. Java Scanner类
  3. SQL Server创建索引
  4. 神仙打架:PG 和 MySQL 到底哪个更好用?
  5. 一位老师,一位领导,一个让全体学生考上目标学校的故事
  6. json符号解释大全_牛年汪姓男孩高端大气的名字大全
  7. Matplotlib 中文用户指南 2 安装
  8. 【Luogu1996】约瑟夫问题(模拟,解法汇总)
  9. 三维设计和动画:Cinema 4D R25 for mac(c4d r25)
  10. 专题四——线段树、树状数组
  11. 微信小程序地图插件系列(一):微信小程序使用高德地图(不定期更新)
  12. 黑马程序员宣传语征集大赛
  13. java web 视频教程下载_Java web(Servlet+Jsp),视频教程下载
  14. 练习7-9 计算天数(15 分)
  15. HR不排斥的三大跳槽理由
  16. PPPOE和pppd的流程详解
  17. 最美的时候你遇见了谁?
  18. Android项目猜纸牌游戏之一 界面设计和资源文件的设计
  19. DNS劫持及网页跳转到莫名站点时应该怎么办?(DNS劫持和HTTP劫持及解决方法)
  20. 一个LM324的电流源方案

热门文章

  1. 动画以及View绘制中的addview实战
  2. laravel 中request
  3. 换行符‘/n’和回车符‘/r’ 区别
  4. 黑客侵入电子签名供应商DocuSign的数据库 随后向用户发起钓鱼攻击
  5. istanbul —— JavaScript 代码覆盖率检查工具
  6. 【POJ1083】 Moving Tables (并行的搬运)
  7. 第13-17章阅读后的思考
  8. mysql初始化主机名无法解析
  9. 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...
  10. HDU 2653 (记忆化BFS搜索+优先队列)