Go 语言多版本管理利器 GVM
# 一、GVM - Go Version Manager
Go
语言版本管理器(GVM
)是管理 Go
语言环境的开源工具.GVM 「pkgsets」
支持安装多个版本的 Go
并管理每个项目的模块.它最初由 Josh Bussdieker
开发,GVM
与 Ruby RVM
类似,允许你为每个项目或一组项目创建一个开发环境,分离不同的 Go
版本和包依赖关系,来提供更大的灵活性,以防不同版本造成的问题.GVM
主要有以下几个特性:
- 管理
Go
的多个版本,包括安装、卸载和指定使用Go
的某个版本 - 查看官方所有可用的
Go
版本,同时可以查看本地已安装和默认使用的Go
版本 - 管理多个
GOPATH
,并可编辑Go
的环境变量 - 可将当前目录关联到
GOPATH
- 可以查看
GOROOT
下的文件差异 - 支持
Go
版本切换
项目地址:https://github.com/moovweb/gvm
# 二、安装 GVM
# 2.1.依赖安装
GVM
本质上就是一个 SHELL
脚本,它背后做的事情是先把源码下载下来,再用 C
做编译.所以,安装 GVM
前你需要先安装一些依赖包.
# Debian/Ubuntu
$ sudo apt-get install curl git mercurial make binutils bison gcc build-essential
# Redhat/Centos
$ sudo yum install curl
$ sudo yum install git
$ sudo yum install make
$ sudo yum install bison
$ sudo yum install gcc
$ sudo yum install glibc-devel
# macOS
$ xcode-select --install
$ brew update
$ brew install mercurial
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意:Centos
官方仓库没有 mercurial
软件包,如果你需要可以在 mercurial
官网 https://www.mercurial-scm.org/downloads
下载后安装.
# 2.2.安装GVM
安装好依赖环境后, GVM
的安装也很简单.官方提供了一键安装脚本,你只需直接运行就行了.
# bash环境安装
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
# zsh环境安装
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
2
3
4
5
如果使用的是 zsh
的话将前面的 bash
改为 zsh
即可,这条命令主要是检查相关依赖环境并下载 GVM
相关的文件,然后创建所需目录,并且在 .bashrc
或者 .zshrc
中加入:
# 加载环境变量
[[ -s "/home/wcl/.gvm/scripts/gvm" ]] && source "/home/wcl/.gvm/scripts/gvm"
2
# 三、使用 GVM 安装和管理 Go 版本
可以开始使用GVM
来安装和管理不同版本的 Go
.首先,可以用 gvm listall
命令显示可以下载和编译可用的 Go
版本.
$ banna@burcedeMacBook-Pro ~ $ gvm listall
gvm gos (available)
go1
go1.0.1
go1.0.2
go1.0.3
go1.1
go1.1rc2
go1.1rc3
go1.1.1
go1.1.2
go1.2
go1.2rc2
go1.2rc3
go1.2rc4
go1.2rc5
go1.2.1
go1.2.2
go1.3
go1.3beta1
go1.3beta2
go1.3rc1
go1.3rc2
go1.3.1
go1.3.2
go1.3.3
go1.4
go1.4beta1
go1.4rc1
go1.4rc2
go1.4.1
go1.4.2
go1.4.3
go1.5
go1.5beta1
go1.5beta2
go1.5beta3
go1.5rc1
go1.5.1
go1.5.2
go1.5.3
go1.5.4
go1.6
go1.6beta1
go1.6beta2
go1.6rc1
go1.6rc2
go1.6.1
go1.6.2
go1.6.3
go1.6.4
go1.7
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
安装特定的 Go
版本只需运行 gvm install <version>
命令,其中 <version>
是表示要安装的版本.假设正在处理一个使用 Go 1.15.5
版本的项目,你就可以使用 gvm install go1.15.5
命令来安装这个版本.
# 安装指定版本
$ gvm install go1.15.5
Installing go1.15.5...
* Compiling...
go1.15.5 successfully installed!
# 查看本地安装的版本信息
$ gvm list
gvm gos (installed)
go1.15.5
=> system
# 切换golang版本
$ gvm use go1.15.5
Now using version go1.15.5
# 查看当前golang版本
$ go version
go version go1.15.5 linux/amd64
# 切换默认使用golang版本
$ gvm use go1.15.5 --default
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
由于
Go 1.5
使用了自举(用Go
编译Go
),如果在系统环境完全没有Go
命令的情况下,直接使用gvm install go
会报错.所以,你必须先安装Go 1.4
.
# 先安装 1.4 版本的,-B 表示只安装二进制包.
$ gvm install go1.4 -B
$ gvm use go1.4
$ export GOROOT_BOOTSTRAP=$GOROOT
# 再安装 1.5+ 版本的
$ gvm install go1.15.5
2
3
4
5
6
7
# 四、使用 GVM pkgset
默认情况下,如果通过 go get
获取一个包,它会被下载到 $GOPATH
目录中的 src
和 pkg
目录下.然后可以使用 import
将其引入到 Go
程序中.然而,在不同的项目中管理相同包的不同版本就会变得困难.
GVM
通过使用「pkgsets
」将项目的新目录附加到 Go
安装版本的默认 $GOPATH
,类似 Linux
系统上的 $PATH
,这样就可以很好地完成了项目之间包的管理和隔离.来看一个实例,安装一个新版本的 Go 1.15.5
.
$ gvm install go1.15.5
Installing go1.15.5...
* Compiling...
go1.15.5 successfully installed
$ gvm use go1.15.5
Now using version go1.15.5
$ echo $GOPATH
/Users/banna/.gvm/pkgsets/go1.15.5/global
2
3
4
5
6
7
8
9
10
当 GVM
被告知使用一个新版本时,它将会更换一个新的 $GOPATH
,gloabl pkgset
将默认使用该版本.
$ echo $GOPATH
/home/chris/.gvm/pkgsets/go1.15.5/global
$ gvm pkgset list
gvm go package sets (go1.15.5)
=> global
2
3
4
5
6
尽管默认情况下没有安装额外的包,但是
global pkgset
中的包对于使用这个特定版本Go
的任何项目都是可用的.
现在,假设你正在启动一个新项目,它需要一个特定的包.首先,使用 GVM
创建一个名为 introToGvm
的新的 pkgset
.
$ gvm pkgset create introToGvm
$ gvm pkgset use introToGvm
Now using version go1.15.5@introToGvm
$ gvm pkgset list
gvm go package sets (go1.15.5)
global
=> introToGvm
2
3
4
5
6
7
8
9
如上所述,一个与 pkgset
同名的新目录 introToGvm
被添加到 $GOPATH
.
$ echo $GOPATH
/Users/banna/.gvm/pkgsets/go1.15.5/introToGvm:/Users/banna/.gvm/pkgsets/go1.15.5/global
2
接下来,验证下新目录 introToGvm
中的目录结构.
$ cd $( awk -F':' '{print $1}' <<< $GOPATH )
$ pwd
/Users/banna/.gvm/pkgsets/go1.15.5/introToGvm
$ ls
overlay pkg src
# 如果没有`pkg`,`src`需要手动创建
mkdir ./{pkg,src}
2
3
4
5
6
7
8
注意:新目录看起来很像普通的
$GOPATH
,新的Go
包会被Go get
命令下载并且被添加到pkgset
中.
最后,使用以下命令获取一个 gorilla/mux
包,然后检查 pkgset
下的内容.
$ go get github.com/gorilla/mux
$ tree ./
./
├── overlay
│ ├── bin
│ └── lib
│ └── pkgconfig
├── pkg
│ ├── mod
│ │ ├── cache
│ │ │ └── download
│ │ │ ├── github.com
│ │ │ │ └── gorilla
│ │ │ │ └── mux
│ │ │ │ └── @v
│ │ │ │ ├── list
│ │ │ │ ├── list.lock
│ │ │ │ ├── v1.8.0.info
│ │ │ │ ├── v1.8.0.lock
│ │ │ │ ├── v1.8.0.mod
│ │ │ │ ├── v1.8.0.zip
│ │ │ │ └── v1.8.0.ziphash
│ │ │ └── sumdb
│ │ │ └── sum.golang.org
│ │ │ ├── lookup
│ │ │ │ └── github.com
│ │ │ │ └── gorilla
│ │ │ │ └── mux@v1.8.0
│ │ │ └── tile
│ │ │ └── 8
│ │ │ ├── 0
│ │ │ │ ├── x006
│ │ │ │ │ └── 042
│ │ │ │ └── x047
│ │ │ │ └── 819.p
│ │ │ │ └── 62
│ │ │ ├── 1
│ │ │ │ ├── 023
│ │ │ │ └── 186.p
│ │ │ │ └── 203
│ │ │ └── 2
│ │ │ └── 000.p
│ │ │ └── 186
│ │ └── github.com
│ │ └── gorilla
│ │ └── mux@v1.8.0
│ │ ├── AUTHORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── bench_test.go
│ │ ├── doc.go
│ │ ├── example_authentication_middleware_test.go
│ │ ├── example_cors_method_middleware_test.go
│ │ ├── example_route_test.go
│ │ ├── go.mod
│ │ ├── middleware.go
│ │ ├── middleware_test.go
│ │ ├── mux.go
│ │ ├── mux_httpserver_test.go
│ │ ├── mux_test.go
│ │ ├── old_test.go
│ │ ├── regexp.go
│ │ ├── regexp_test.go
│ │ ├── route.go
│ │ └── test_helpers.go
│ └── sumdb
│ └── sum.golang.org
│ └── latest
└── src
33 directories, 33 files
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
如上所示,gorilla/mux
按照预期添加到了 pkgset
的 $GOPATH
目录,现在你就可以与使用该 pkgset
的项目一起使用该模块了.
# 五、卸载 GVM 或指定版本 Go 语言
1.如果只是想卸载某个安装好的 Go
版本,可以使用以下指令.
$ gvm uninstall go1.15.5
2.如果想完全卸载掉 GVM 和 所有安装的 Go 版本,可以使用以下指令.
$ gvm implode
- 01
- AWS NAT-NetWork-Firwalld配置(一)04-09
- 02
- AWS NAT-NetWork-Firwalld配置(二)04-09
- 03
- kubernetes部署minio对象存储01-18