Bruce Blog Bruce Blog
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航

Bruce Tao

运维界的该溜子
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航
  • 基础

  • Go进阶

  • Go框架

  • Golang辅助

    • Golang环境配置

      • Golang环境配置日常记录
      • Go 语言多版本管理利器 GVM
        • Go mod代理配置
      • GolangIDE

    • Golang
    • Golang辅助
    • Golang环境配置
    Bruce
    2022-09-09
    目录

    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
    
    1
    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)
    
    1
    2
    3
    4
    5

    如果使用的是 zsh 的话将前面的 bash 改为 zsh 即可,这条命令主要是检查相关依赖环境并下载 GVM 相关的文件,然后创建所需目录,并且在 .bashrc 或者 .zshrc 中加入:

    # 加载环境变量
    [[ -s "/home/wcl/.gvm/scripts/gvm" ]] && source "/home/wcl/.gvm/scripts/gvm"
    
    1
    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
       ...
    
    1
    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
    
    1
    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
    
    1
    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
    
    1
    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
    
    1
    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
    
    1
    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
    
    1
    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}
    
    1
    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
    
    1
    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
    
    1

    2.如果想完全卸载掉 GVM 和 所有安装的 Go 版本,可以使用以下指令.

    $ gvm implode
    
    1
    上次更新: 2024/04/09, 16:48:42
    Golang环境配置日常记录
    Go mod代理配置

    ← Golang环境配置日常记录 Go mod代理配置→

    最近更新
    01
    AWS NAT-NetWork-Firwalld配置(一)
    04-09
    02
    AWS NAT-NetWork-Firwalld配置(二)
    04-09
    03
    kubernetes部署minio对象存储
    01-18
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Bruce Tao Blog Space | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式