Why
早期,Golang 版本及包管理令人痛苦。1.11 之后 go mod 的出现支持了包管理,但不同项目下若要求不同的 Golang 版本,我们如何处理?
What
GVM - Go Version Manager
, 帮助我们解决了这一难题。
https://github.com/moovweb/gvm
本文仅对 mac/linux 系统;windows gvm 请查阅官网,应该也差不多
gvm 原理
gvm 是利用脚本编写指令,对环境变数进行判断跟修改,gvm 成功安装后会在 ~/.bashrc
或者 .zshrx
等脚本档案最后加一条类似如下的命令:
[[ -s "/Users/fee/.gvm/scripts/gvm" ]] && source "/Users/fee/.gvm/scripts/gvm"
安装路径各人会有所不同,如对 shell 脚本编写感兴趣的可参考 鸟哥的Linux私房菜
每次使用 gvm use [version]
的指令后,环境变数都会被改变(GOROOT & GOPATH)
How
安装
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
用 zsh
的将 bash
改为 zsh
常用命令
$ gvm help # 命令帮助
go 版本安装、切换及使用
$ gvm list # 列出本机所有go版本;当前版本 => 表示
$ gvm listall # 列出所有可安装go版本
$ gvm install go1.14 # 安装指定的go版本;如 go1.14
$ gvm uninstall go1.12.8 # 卸载指定的go版本;如 go1.12.8
$ gvm use go1.14 [--default] # gvm 启用对应的go版本 (--default to set permanently)
参考运行如下(也可用 go version 命令确认当前版本):
gvm pkgset
当 GVM
被告知使用一个新版本时,它将会更换一个新的 $GOPATH
,gloabl pkgset
将默认使用该版本。
常用方式如下:
$ gvm pkgset create test # 创建一个 gvm pkgset, 名称为test
$ gvm pkgset use test # 使用 test
Now using version go1.14.2@test
$ gvm pkgset list
gvm go package sets (go1.14.2)
global
=> test
更多有关 pkgset 的介绍如下:
开箱即用,Go 有一种出色而令人沮丧的管理包和模块的方式。
默认情况下,如果你
go get
获取一个包,它将被下载到$GOPATH
目录中的src
和pkg
目录下,然后可以使用import
将其包含在你的 Go 程序中。这使得获得软件包变得很容易,特别是对于非特权用户,而不需要sudo
或 root 特权(很像 Python 中的pip install --user
)。然而,在不同的项目中管理相同包的不同版本是非常困难的。GVM 通过使用 “pkgsets” 将项目的新目录附加到安装的 Go 版本的默认
$GOPATH
上,很好地实现了项目之间包的管理和隔离,就像$PATH
在 Unix/Linux 系统上工作一样。作者:Linux中国
常见问题
下载源
gvm 默认使用 github 的源,如果是其他源,如 googlesource,则大陆无法访问,需要更改源,修改方法为:
vim ~/.gvm/scripts/install
修改
GO_SOURCE_URL=https://github.com/golang/go
注意点
- GVM 安装新版本之后,Go 环境变量会重新设置,为了节约磁盘空间和时间,建议把之前版本的 GOPATH 内容移动到新版本对应的 GOPATH 目录下,相关路径可以通过 go env 获取
- 在同一版本下,用 gvm pkgset 创建多个 GOPATH,可能会占用你比较大的磁盘空间