GVM管理Go版本
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)
查看版本:
查看版本失败,执行命令:yum install bison
再次查看版本,执行命令:gvm version
3.GVM的使用
3.1查看当前机器的Go环境
3.2安装不同版本的Go,方便切换使用
3.3切换Go版本
- 使用Go1.5
- 使用Go1.8
- 使用Go1.9
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,互相不干扰。
GVM管理Go版本的更多相关文章
- 使用 nvm 管理不同版本的 node 与 npm
补充说明:Mac 下通过 brew install nvm 所安装的 nvm ,由于安装路径不同,无法正确启用.建议使用 brew uninstall nvm 卸载掉之后,通过本文的方案重新安装一次. ...
- 怎么使用git来管理项目版本?
怎么使用git来管理项目版本和存放代码? 作者:rongfangliu 转载请注明出处:http://www.cnblogs.com/rongfangliu/p/howuseGit.html 工具: ...
- 使用tortoise git管理gitolite版本库
gitolite-admin是用于管理git版本库的版本库,将其从服务器上clone下来. 使用tortoise git clone的时候需要指定私钥,私钥的格式是ppk的,需要使用putty的PUT ...
- pyenv简介——Debian/Ubuntu中管理多版本Python
pyenv简介——Debian/Ubuntu中管理多版本Python MAY 21ST, 2016 12:00 AM | COMMENTS pyenv是管理Python版本的工具,它支持在多个Pyth ...
- SQL Server中TempDB管理(版本存储区的一个example)
原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ...
- 让 Homebrew 走代理更新 + brew 管理 node 版本
0.前言 环境:MacOS 背景:整理下今天所做的配置. 1. 让 Homebrew 走代理更新 brew update 就卡住了,即使开了 shadowsocks 也不行.因为 shadowsock ...
- 使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境
在上一篇博客中,我介绍了如何在ubutnu 18.04中安装pyenv.这一次我将介绍如何使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境. 0.相关命令 首先使用pye ...
- windows 安装nvm步骤(shi'yongnvm-windows管理node版本):
瞎几把前言:mac上可以用n来管理node版本,私以为n很好用.家里的win7台式机一直没有安装过任何管理工具,今天来给家里电脑安装一下nvw-windows,一个用于windows系统的node版本 ...
- nvm管理不同版本的node和npm
写在前面 nvm(nodejs version manager)是nodejs的管理工具,如果你需要快速更新node版本,并且不覆盖之前的版本:或者想要在不同的node版本之间进行切换:使用nvm来安 ...
随机推荐
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面 1. 常用算法1 1.1. 目录2 1.2. 定义和用法编辑2 1.3 ...
- GNU LD 脚本学习笔记
LD脚本(linker script)是什么 GNU ld是链接器,ld实际并不是GCC的一部分,ld属于binutils软件包.但是嵌入式开发时,下载的linaro GCC工具集中是包含 arm-l ...
- 第1章列表处理——1.1 Lisp列表
Lisp是啥? Lots of Isolated Silly Parentheses (大量分离的愚蠢的括号) Lisp指的是"LISt Processing"(列表处理),通过把 ...
- C语言include预处理命令与多文件编译
#include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...
- Linux驱动platform
platform device<==> platform bus <==> platform driver 转自:platform设备驱动全透析 宋宝华 http://blog ...
- Android View中getViewTreeObserver().addOnGlobalLayoutListener() (转)
转自:Android View中getViewTreeObserver().addOnGlobalLayoutListener() 我们知道在oncreate中View.getWidth和View.g ...
- 嵌入式开发之web服务器---boa移植
近段时间在做ti8148的编解码器又涉及到boa web服务器的移植.在移植到ARM开发板的过程中,遇到很多的问题.原先的自带thttpd 由于功能没有boa完善,比如在ubuntu下面的utf-8编 ...
- angular选择器功能
1.$event对象 $event对象其实就是潜在的jQuery事件对象,通过$event.currentTarget获取当前元素,通过$event.target获取当前元素的子元素. 例如: ...
- JQuery+Json 省市区三级联动
一.画面以及JS <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content=&qu ...
- 【php】global的使用与php的全局变量
php的全局变量和其余编程语言是不同的,在大多数的编程语言中,全局变量在其下的函数.类中自己主动生效.除非被局部变量覆盖,或者根本就不同意再声明同样名称与类型的局部变量.可是php中的全局变量不是默认 ...