Golang 多版本管理工具gvm
gvm,即 Go Version Manager,Go 版本管理器,使用 shell 脚本开发,它可以非常轻量的切换 Go 版本。对比其他语言,通常也有类似的工具,如 NodeJS 的 NVM,Python 的 pyenv 等。在使用方法上和 Python 的多版本管理工具 pyenv 非常类似。
其实不借助类似的版本管理工具安装多个版本 Go 也是可以自己手动实现的,做法很简单,就是下载不同的 Golang 安装包,然后放置到独立的目录,使用时将 GOROOT 和 GOPATH 指向对应版本的目录即可完成版本切换。其实 gvm 原理上就是这么做的,只不过通过工具的形式将这些繁杂的手工操作封装起来,使得开发起来更加优雅,不必再为 Go 的安装、版本管理花费更多的心思。下面为 gvm 的工作原理(借用了网上的图):
其中几个主要的目录,如下:
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))
如果想要安装到指定目录:
- 先下载安装脚本
wget https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer
- 修改安装脚本
把GVM_DEST改为你要安装的目录:
- 开始执行脚本安装
sh gvm-installer
- 配置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"
有疑问加站长微信联系(非本文作者)