Go 版本管理器 gvm 怎么使用?
1.介紹
在使用 Go 開發(fā)項目時,通常我們會遇到關(guān)于 Go 版本的一些問題,比如:公司的舊項目使用的低版本 Go 開發(fā),新項目使用的高版本 Go 開發(fā)。
或者,公司的 Go 項目使用的低版本 Go 開發(fā),我們想要學(xué)習(xí) Go 新版本的一些新特性。
總之,我們就是有使用不同 Go 版本開發(fā)項目的需求。
本文給讀者朋友們推薦的是 Go 版本管理器 gvm[1],使用 gvm 可以非常方便切換 Go 開發(fā)環(huán)境的 Go 版本。
2.安裝
我的本地開發(fā)環(huán)境是 macOS 系統(tǒng),以 macOS 為例,安裝 gvm 的步驟如下:
- 安裝解析生成器 Bison[2]。
 
執(zhí)行命令:
brew install bison需要注意的是,通常在 macOS 中,已存在 bison,可以執(zhí)行命令 which bison 檢查,如果不存在,再使用 macOS 軟件包管理器 Homebrew[3] 安裝。
- 安裝 gvm。
 
執(zhí)行命令:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)需要注意的是,如果你使用的不是 bash,請更改為你使用的 shell,比如你使用的 zsh,只需把 bash 改為 zsh。
安裝完之后,在你的 ~/.bashrc 或 ~/.zshrc 中添加以下命令:
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"然后,執(zhí)行命令 source ~/.bashrc 或 source ~/.zshrc。
- 輸出 gvm 版本號。
 
執(zhí)行命令:
gvm version輸出結(jié)果:
Go Version Manager v1.0.22 installed at /Users/frank/.gvm如果可以輸出 gvm 的版本號,說明已成功安裝 gvm。
需要注意的是,如果你使用的不是 macOS,而是 Linux 發(fā)行版 Ubuntu 或者 Centos 等,請參考官方文檔,安裝所需的依賴。
3.基礎(chǔ)使用方式
在安裝 gvm 之后,我們可以執(zhí)行 gvm 查看 gvm 支持的命令。
安裝 go:
首先,我們可以執(zhí)行命令 gvm listall 查看 gvm 收錄的 Go 版本,然后,我們可以執(zhí)行命令 gvm install go1.24.4 安裝指定 Go 版本。
選擇 go:
安裝多個 Go 版本之后,我們可以執(zhí)行命令 go use go1.24.4 選擇使用的 Go 版本。
卸載 go:
如果我們想要卸載某個不再需要的 Go 版本,我們可以執(zhí)行命令 go uninatll go1.24.1,但是,需要注意的是,我們需要先執(zhí)行命令 gvm use go1.24.1 && go clean -modcache,然后,再執(zhí)行命令 gvm uninstall go1.24.1 刪除 Go 版本。
4.進階使用方式 - pkgset
在掌握了基礎(chǔ)使用方式之后,我們再聊聊進階使用方式 - 包集(pkgset)機制。
當(dāng)我們使用 gvm use go1.24.4 選擇 Go 版本之后,執(zhí)行命令 echo $GOPATH,輸出結(jié)果是 /Users/frank/.gvm/pkgsets/go1.24.4/global。
進入 GOPATH 目錄 cd $GOPATH,執(zhí)行命令 ls -l,輸出 overly,該目錄包含 2 個子目錄,分別是 bin 和 lib。
cd $GOPATH
tree
.
└── overlay
    ├── bin
    └── lib
        └── pkgconfig實際上,這就是 gvm 的包集(pkgset)機制,默認(rèn)創(chuàng)建全局包集 global,作為默認(rèn)包集,該路徑作為環(huán)境變量 GOPATH。
我們在該路徑下創(chuàng)建 src 目錄,用于存放 Go 代碼。
其中,包集路徑下的子目錄 overlay 的作用是作為環(huán)境變量 GOBIN,比如執(zhí)行命令 go install 或 go build -o 生成二進制文件時,gvm 會將路徑 /Users/frank/.gvm/pkgsets/go1.24.4/global/overlay/bin 作為環(huán)境變量 GOBIN。
另外一個作用是存放我們安裝的自定義工具,比如 easyjson。
比如,當(dāng)我們需要使用不同版本的工具(比如 easyjson)時,我們可以使用 gvm 的包集(pkgset)機制,創(chuàng)建不同的包集,安裝不同版本的自定義工具。
我們可以使用 gvm 的子命令 pkgset 管理 Go 包。
gvm 創(chuàng)建包集(pkgset):
gvm pkgset create mypkggvm 選擇包集(pkgset):
gvm pkgset use mypkg
Now using pkgset go1.24.4@mypkg列出所有包集(pkgset):
gvm pkgset list
gvm go package sets (go1.24.4)
    global
=>  mypkg通過 gvm 的包集機制,使我們在同一臺機器上,可以維護多個版本的 Go 和多個版本的工具。使不同版本的 Go 完全隔離它們的包和依賴。
5.進階使用方式 - .gvmrc
我們前面講的都是執(zhí)行 gvm 命令的方式,使用 gvm 管理 Go 版本和包集,實際上還可以使用 .gvmrc 配置文件的方式。
GOPATH 模式
以 GOPATH 模式的項目為例,Go 項目的目錄結(jié)構(gòu):
~/.gvm/
└── pkgsets/
    └── go1.24.4/
        └── myproject/                  <-- gvm 的 pkgset: GOPATH 根目錄
            ├── overlay/                <-- go install 安裝的工具
            ├── pkg/                    <-- 編譯后緩存包
            └── src/                    <-- GOPATH 模式項目代碼都放這里
                └── github.com/
                    └── yourname/
                        └── yourproject/
                            ├── .gvmrc
                            ├── main.go
                            └── util/
                                └── helper.go.gvmrc 項目級配置文件:
.gvmrc 配置文件的示例內(nèi)容:
# go1.24.4
go1.24.4@myproject其中,go1.24.4 表示指定項目使用的 Go 版本;go1.24.4@myproject 表示指定項目使用的 Go 版本和包集。
使用方式:.gvmrc 配置文件并不會自動生效,需要進入項目目錄中,執(zhí)行命令 gvm pkgset use。
需要注意的是,一般我們會把 .gvmrc 文件放在項目目錄的根目錄中,但是,也可以放在其它目錄中,執(zhí)行命令 gvm pkgset use -f path/to/.gvmrc,通過 -f 選項指定 .gvmrc 的路徑。
Go Modules 模式
實際上,在 go v1.11 開始,社區(qū)開始推薦使用 Go Modules 模式,不建議繼續(xù)使用 GOPATH 模式。
以 Go Modules 模式為例,Go 項目的目錄結(jié)構(gòu):
~/code/myapp/                  <-- 項目根目錄
│
├── .gvmrc                     <-- 指定使用的 Go 版本和 pkgset(如 go1.24.4@mypkg)
├── go.mod                     <-- Go modules 項目
├── go.sum
│
├── cmd/                       <-- 程序入口目錄(main.go 通常放在這里)
│   └── myapp/
│       └── main.go
│
├── internal/                  <-- 項目私有代碼
│   └── config/
│       └── config.go
│
├── pkg/                       <-- 可復(fù)用的庫代碼
│   └── util/
│       └── string.go
│
├── api/                       <-- 接口定義、protobuf 或 OpenAPI 等
│   └── proto/
│       └── service.proto
│
├── scripts/                   <-- 腳本目錄,比如構(gòu)建/部署腳本
│   └── build.sh
│
├── README.md
└── Makefile                   <-- 推薦添加 Makefile 簡化常用操作我們可以發(fā)現(xiàn),.gvmrc 配置文件在 Go Modules 模式的 Go 項目的根目錄。
同樣,我們進入項目目錄之后,通過執(zhí)行命令 gvm pkgset use 讀取 .gvmrc 中的配置信息。
6.總結(jié)
本文我們介紹怎么使用 Go 版本管理器 gvm 在同一臺機器上維護多個版本的 Go 和多個版本的工具。
讀者朋友們?nèi)绻灿性撔枨?,推薦大家試用一下 gvm。
需要注意的是,gvm 不支持 Windows,使用 Windows 的讀者朋友們,可以選擇其它版本管理器,比如 g 和 asdf 等。















 
 
 






 
 
 
 