Golang 多版本管理工具gvm

Felix_Shang · · 89 次点击 · · 开始浏览    

Golang 多版本管理工具gvm

gvm,即 Go Version Manager,Go 版本管理器,使用 shell 脚本开发,它可以非常轻量的切换 Go 版本。对比其他语言,通常也有类似的工具,如 NodeJS 的 NVM,Python 的 pyenv 等。在使用方法上和 Python 的多版本管理工具 pyenv 非常类似。

其实不借助类似的版本管理工具安装多个版本 Go 也是可以自己手动实现的,做法很简单,就是下载不同的 Golang 安装包,然后放置到独立的目录,使用时将 GOROOT 和 GOPATH 指向对应版本的目录即可完成版本切换。其实 gvm 原理上就是这么做的,只不过通过工具的形式将这些繁杂的手工操作封装起来,使得开发起来更加优雅,不必再为 Go 的安装、版本管理花费更多的心思。下面为 gvm 的工作原理(借用了网上的图):


图片1.png

其中几个主要的目录,如下:

archive             # go 源码
bin                 # gvm 可执行文件
environments        # 不同环境的环境变量配置
scripts             # gvm 的子命令脚本
logs                # 日志信息
pkgsets             # 每个独立环境 gopath 所在路径

举一反三,之后如果遇到同样的需求,我们可以自己实现。

gvm安装

bash < <(curl -s -S -L [<u>https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)</u>](https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer))

如果想要安装到指定目录:

  1. 先下载安装脚本

wget https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer

  1. 修改安装脚本

把GVM_DEST改为你要安装的目录:

图片2.png
  1. 开始执行脚本安装

sh gvm-installer

  1. 配置gvm的环境变量

以centos7为例,在/etc/profile最后加入:

# go 版本切换工具gvm
[[ -s "/opt/gvm/scripts/gvm" ]] && source "/opt/gvm/scripts/gvm"

安装可能遇到的坑:

$ gvm  install go1.12.10
Downloading Go source...
ERROR: Couldn't download Go source. Check the logs /Users/jim/.gvm/logs/go-download.log

根据提示看 log 报错

Cloning into '/Users/jim/.gvm/archive/go'...
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

解决问题:

vim ~/.gvm/scripts/install
修改 GO_SOURCE_URL 变量地址为: GO_SOURCE_URL=git://github.com/golang/go

GVM的使用

1.列出当前已安装的 Go 版本

# gvm list
gvm gos (installed)
   go1.10.8
   go1.12.6
   system

2.列出当前可以安装的 Go 版本

# gvm listall

3.安装指定版本的 Go

# gvm install go1.12.10

4.切换到指定的 Go 版本

临时切换:gvm use go1.12.6
切换指定一个默认版本:gvm use go1.12.6 --default   

切换后查看版本/环境变量:

# go version
go version go1.12.6 linux/amd64
# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/opt/gvm/pkgsets/go1.12.6/global"
GOPROXY=""
GORACE=""
GOROOT="/opt/gvm/gos/go1.12.6"
GOTMPDIR=""
GOTOOLDIR="/opt/gvm/gos/go1.12.6/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build027007214=/tmp/go-build -gno-record-gcc-switches"

欢迎关注我们的微信公众号,每天学习Go知识

本文来自:简书

感谢作者:Felix_Shang

查看原文:Golang 多版本管理工具gvm

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:muxilin131420 备注:入群;或加QQ群:815126783

89 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传