GVM 使用指南:管理多版本 Go

GVM 使用指南:管理多版本 Go

GVM 使用指南:管理多版本 Go

GVM(Go Version Manager)是 Go 版本管理工具,定位类似于 Node 生态的nvm、Python 生态的 uv。它可以在同一台机器上安装、切换多个 Go 版本,互不干扰。

日常开发中最常见的需求无非这几个:装 gvm → 看有哪些版本 → 装指定版本 → 切到指定版本 → 设为默认。本文按这条主线展开,并在最后单独说明一个新人必踩的坑——源码编译依赖预装 Go


1. 安装 GVM

通过官方安装脚本一键安装(依赖bashcurl/git):

bash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

安装脚本会把 gvm 本体放在~/.gvm/,并向你的 shell 配置文件(~/.bashrc~/.zshrc~/.profile)追加一段初始化代码。让配置生效:

source~/.bashrc# zsh 用户用: source ~/.zshrc

验证安装:

gvm version

如果提示 gvm 命令找不到,多半是初始化脚本没被当前 shell 加载,确认 [[ -s “KaTeX parse error: Expected 'EOF', got '&' at position 27: …cripts/gvm" ]] &̲& source "HOME/.gvm/scripts/gvm” 已写进你的 rc 文件,同时确认第一步安装已完成。


2. 查看可安装的版本列表

gvm listall

它会拉取 Go 官方所有发布版本(如go1.21.0go1.22.3go1.23.0等)。版本号较多,可以配合grep过滤:

gvm listall|grepgo1.22

查看本地已经安装的版本用:

gvm list

3. 安装指定版本

gvminstallgo1.22.3

⚠️ 这条命令默认会下载源码并在本地编译,并非直接下载预编译包。详见 第 6 节:新手必踩的坑。

更省心的做法是加--binary参数,直接下载官方预编译二进制,跳过编译:

gvminstallgo1.22.3--binary

4. 使用指定版本

安装完成后,切换到该版本(仅对当前 shell生效):

gvm use go1.22.3

验证:

go version# 输出: go version go1.22.3 ...

5. 默认使用指定版本

gvm use只影响当前终端会话,新开一个窗口又会变回旧版本。要永久设为默认,加--default

gvm use go1.22.3--default

此后每个新开的 shell 都会自动激活这个版本,无需再手动gvm use


6. 新手必踩的坑:源码编译依赖预装 Go

这是 GVM 最反直觉的一点,值得单独拎出来讲。

现象:当你执行gvm install go1.22.3不带--binary)时,GVM 会克隆 Go 源码、执行make.bash在本地编译。如果机器上没有预装任何 Go,编译会失败,常见报错类似:

ERROR: Couldn't find Go 1.4 bootstrapper in ... Building Go cmd/dist using /path/to/go1.4 go: command not found

原因:Go 从 1.5 起是自举(self-hosted)语言——Go 编译器本身就是用 Go 写的,因此编译 Go 工具链需要一个已有的 Go 编译器作为引导(bootstrap toolchain,通常是go1.4)。GVM 在源码编译路径下默认会去找一个名为go1.4的 bootstrap 编译器;找不到就编不动。这就形成了「想用 gvm 装 Go,得先有个 Go」的鸡生蛋困境。

三种解法(推荐第一种):

  1. 直接用--binary(推荐)

    gvminstallgo1.22.3--binary

    跳过编译,下载官方预编译包,几秒钟搞定,绝大多数场景都不需要本地编译。

  2. 先手动装一个引导 Go

    从 go.dev/dl 下载官方包,或用系统包管理器装一个临时版本,再让 GVM 用它做 bootstrap。装好第一个 gvm 管理的版本后,临时 Go 即可移除。

  3. 让 GVM 自己编译一个go1.4bootstrap

    gvminstallgo1.4--binary# 先准备 bootstrapgvminstallgo1.22.3# 再源码编译目标版本

    仅当你确实需要源码编译(例如要打特定GOOS/GOARCH、开启/关闭cgo等自定义构建选项)时才有必要。

结论:如果只是日常开发切换 Go 版本,无脑加--binary即可,能省去所有编译相关的麻烦。


附:其他常用命令

命令作用
gvm list查看本地已安装版本
gvm listall查看所有可安装版本
gvm install <ver> --binary安装(预编译二进制,推荐)
gvm use <ver>当前 shell 切换版本
gvm use <ver> --default设为默认版本
gvm uninstall <ver>卸载指定版本
gvm implode彻底卸载 gvm 本体(慎用)

快速上手(TL;DR)

# 1. 安装 gvmbash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)source~/.bashrc# 2. 看可用版本gvm listall|grepgo1.22# 3. 装指定版本(务必加 --binary,避免源码编译的坑)gvminstallgo1.22.3--binary# 4. 切换使用gvm use go1.22.3# 5. 设为默认gvm use go1.22.3--default