1.为什么要安装GVM
1.1什么是GVM
GVM是一个golang虚拟环境配置工具,其允许一台机器上安装多个golang版本,gvm是第三方开发的Go多版本管理工具,类似ruby里面的rvm工具。使用起来相当的方便。它是以shell脚本开发的工具,同时兼容bash和zsh,用法和ruby的rvm很像,能做到Go语言版本的切换以及GOPATH的修改。
1.2Go的项目隔离
在我们进行一个项目的开发时,总是希望一个项目独立使用一个workspace,用于隔离各个项目的依赖环境。以ruby项目为例,如果公用workspace,会导致gemset公用,可能在多项目开发的时候,难以隔离各个项目不同的gem,在开发以及运行时出现预料外的问题,所以一般的ruby项目,都会在项目根目录下,使用.ruby-version以及.ruby-gemset来规定当前项目的ruby版本以及gemset,配合rvm或rbenv等版本工具,使ruby项目能使用独立的workspace。
比照ruby语言,Go语言在使用中也面临了2个问题:
1.语言版本进步很快,需要对应项目进行语言版本管理。
2.第三方库的版本隔离
要解决问题1,我们需要一个工具来安装多个Go版本,并提供方便的切换功能。
而对于问题2,我们知道Go使用GOPATH这个环境变量来管理编译时的源代码路径,所以第三方库也是下载在GOPATH下,并且我们的源代码也需要处于GOPATH下。于是就需要一个工具,能根据方便的设置GOPATH。
在网上搜寻后,发现了 gvm 这个好用的工具。这个以shell脚本开发的工具,同时兼容bash和zsh,用法和ruby的rvm很像,能做到Go语言版本的切换以及GOPATH的修改。
2.安装GVM
执行命令:bash <<(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU2JTg5JUE3JUU4JUExJThDJUU1JUFFJTg5JUU4JUEzJTg1JUU1JTkxJUJEJUU0JUJCJUE0LlBORz92ZXJzaW9uPTEmbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NDY5MzU0MDAwJmFwaT12Mg==)
查看版本:
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU2JTlGJUE1JUU3JTlDJThCJUU3JTg5JTg4JUU2JTlDJUFDJUU1JUE0JUIxJUU4JUI0JUE1LlBORz92ZXJzaW9uPTEmbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NDY5NTE1MDAwJmFwaT12Mg==)
查看版本失败,执行命令:yum install bison
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU1JUFFJTg5JUU4JUEzJTg1Ymlzb24uUE5HP3ZlcnNpb249MSZtb2RpZmljYXRpb25EYXRlPTE1MDU0Njk1NzEwMDAmYXBpPXYy)
再次查看版本,执行命令:gvm version
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU2JTlGJUE1JUU3JTlDJThCR1ZNJUU3JTg5JTg4JUU2JTlDJUFDLlBORz92ZXJzaW9uPTEmbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NDY5NjIzMDAwJmFwaT12Mg==)
3.GVM的使用
3.1查看当前机器的Go环境
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvbGlzdC5QTkc_dmVyc2lvbj0xJm1vZGlmaWNhdGlvbkRhdGU9MTUwNTc1MDU4NDA3NiZhcGk9djI=)
3.2安装不同版本的Go,方便切换使用
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU1JUFFJTg5JUU4JUEzJTg1Z28xLjUuUE5HP3ZlcnNpb249MSZtb2RpZmljYXRpb25EYXRlPTE1MDU3NTA2NjQ2NTImYXBpPXYy)
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU1JUFFJTg5JUU4JUEzJTg1MS45LlBORz92ZXJzaW9uPTEmbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NzUwNjcxOTM0JmFwaT12Mg==)
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvZ28xLjguUE5HP3ZlcnNpb249MSZtb2RpZmljYXRpb25EYXRlPTE1MDU3NTA2NzUxMjYmYXBpPXYy)
3.3切换Go版本
- 使用Go1.5
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU0JUJEJUJGJUU3JTk0JUE4JUU3JTg5JTg4JUU2JTlDJUFDZ28xLjUuUE5HP3ZlcnNpb249MSZtb2RpZmljYXRpb25EYXRlPTE1MDU3NTA5MjUxOTcmYXBpPXYy)
- 使用Go1.8
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU0JUJEJUJGJUU3JTk0JUE4JUU3JTg5JTg4JUU2JTlDJUFDMS44LlBORz92ZXJzaW9uPTImbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NzUwOTk0NjkzJmFwaT12Mg==)
![](https://www.#.com/go/aHR0cDovLzE5Mi4xNjguNTkuMTQyOjgwOTAvZG93bmxvYWQvYXR0YWNobWVudHMvMTA3NDgzMTcvJUU0JUJEJUJGJUU3JTk0JUE4JUU3JTg5JTg4JUU2JTlDJUFDMS45LlBORz92ZXJzaW9uPTEmbW9kaWZpY2F0aW9uRGF0ZT0xNTA1NzUxMDMxNjI0JmFwaT12Mg==)
3.4使用GVM创建项目的workspace
我们来新建一个项目,名字叫pprof。项目目录放在~/goproj/pprof
下。
mkdir -p ~/goproj/pprof
cd ~/goproj/pprof
gvm pkgset create --local
gvm pkgset use --local
mkdir src
在上面的命令中,我们创建了项目的目录,进入目录后,使用gvm pkgset create -local
命令,将目录设为一个local的pkgset,然后通过gvm pkgset use --local
来使用它,这时,当前的环境变量的GOPATH为:
$HOME/goproj/pprof:$HOME/goproj/pprof/.gvm_local/pkgsets/system/local:$HOME/.gvm/pkgsets/system/global
可以看到,GOPATH已经被设置为pprof这个项目目录了,这时我们执行go get
命令来下载第三方库的时候,会默认下载到$HOME/goproj/pprof/src
目录下。
接下来,我们来创建真正用于代码管理的目录:
mkdir -p ~/goproj/pprof/src/pprof
cd ~/goproj/pprof/src/pprof
git init
这里,我们用git来管理项目的软件版本。现在,我们可以在~/goproj/pprof/src/pprof
这个目录下来编写代码了。
3.5最终效果
在不同的项目目录下使用的go版本不同,并且隔离各个项目的依赖环境。
总结
通过使用gvm,我们能够根据项目切换Go语言版本以及切换GOPATH目录。这2大功能,帮助我们给每一个Go项目提供独立的workspace,互相不干扰。
参考链接:http://www.yaozihao.cn/2017/03/08/linux-使用gvm安装并管理go版本/
https://studygolang.com/articles/4788