Go 版本管理器 gvm 怎么使用?
1.介紹
在使用 Go 開發(fā)項目時,通常我們會遇到關于 Go 版本的一些問題,比如:公司的舊項目使用的低版本 Go 開發(fā),新項目使用的高版本 Go 開發(fā)。
或者,公司的 Go 項目使用的低版本 Go 開發(fā),我們想要學習 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.基礎使用方式
在安裝 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
在掌握了基礎使用方式之后,我們再聊聊進階使用方式 - 包集(pkgset)機制。
當我們使用 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)機制,默認創(chuàng)建全局包集 global,作為默認包集,該路徑作為環(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。
比如,當我們需要使用不同版本的工具(比如 easyjson)時,我們可以使用 gvm 的包集(pkgset)機制,創(chuàng)建不同的包集,安裝不同版本的自定義工具。
我們可以使用 gvm 的子命令 pkgset 管理 Go 包。
gvm 創(chuàng)建包集(pkgset):
gvm pkgset create mypkg
gvm 選擇包集(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/ <-- 可復用的庫代碼
│ └── 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 等。