脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 安装了多个版本的 Go,该怎么用才正确?

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

2021-07-29 00:00Go编程时光写代码的明哥 Golang

实际开发中会接触到不同的开源项目,而这些项目有可能是不同团队开发的,使用的 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

延伸 · 阅读

精彩推荐
  • Golanggo语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    无尽海3862020-04-24
  • GolangGo语言基础单元测试与性能测试示例详解

    Go语言基础单元测试与性能测试示例详解

    这篇文章主要为大家介绍了Go语言基础单元测试与性能测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步...

    枫少文7812021-12-05
  • GolangGo语言range关键字循环时的坑

    Go语言range关键字循环时的坑

    今天小编就为大家分享一篇关于Go语言range关键字循环时的坑,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    benben_20154202020-05-23
  • GolangGO语言字符串处理Strings包的函数使用示例讲解

    GO语言字符串处理Strings包的函数使用示例讲解

    这篇文章主要为大家介绍了GO语言字符串处理Strings包的函数使用示例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加...

    Jeff的技术栈6882022-04-14
  • GolangGolang 语言极简类型转换库cast的使用详解

    Golang 语言极简类型转换库cast的使用详解

    本文我们通过 cast.ToString() 函数的使用,简单介绍了cast 的使用方法,除此之外,它还支持很多其他类型,在这没有多多介绍,对Golang 类型转换库 cast相关知...

    Golang语言开发栈6112021-12-02
  • GolangGo语言实现自动填写古诗词实例代码

    Go语言实现自动填写古诗词实例代码

    这篇文章主要给大家介绍了关于Go语言实现自动填写古诗词的相关资料,这是最近在项目中遇到的一个需求,文中通过示例代码介绍的非常详细,需要的朋...

    FengY5862020-05-14
  • GolangGolang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等)

    本文介绍了示例介绍了Golang 负载均衡的四种实现,主要包括了随机,轮询,加权轮询负载,一致性hash,感兴趣的小伙伴们可以参考一下...

    Gundy_8442021-08-09
  • Golang深入浅析Go中三个点(...)用法

    深入浅析Go中三个点(...)用法

    这篇文章主要介绍了深入浅析Go中三个点(...)用法,需要的朋友可以参考下...

    踏雪无痕SS6472021-11-17