gvm vs asdf: Go バージョンの管理
gvm は GOPATH と pkgset を扱う Go 専用のバージョンマネージャ。asdf はプラグイン経由で Go を他の多数の言語と並べて管理します。
gvm は Go のみに注力し、複数の Go バージョンをインストールし、GOPATH を管理し、modules 以前の時代に依存関係を分離する pkgset を提供します。asdf はプラグインと共有の .tool-versions ファイルで Go を管理し、Node、Python などと統一します。Go modules が標準となった今、gvm の追加機構の多くは重要性が下がり、asdf(または公式ツールチェーン)がほとんどのニーズをカバーします。
| gvm | asdf | |
|---|---|---|
| スコープ | Go のみ | ポリグロット |
| GOPATH / pkgset | 組み込み | 不要 (modules) |
| 設定ファイル | gvm 固有 | .tool-versions |
| メンテナンス | 活発でない | 活発 |
| 最適な用途 | レガシーな Go ワークフロー | 多言語リポジトリ |
CI では
CI では、Go は通常 setup-go か、単一バージョンを固定する asdf でインストールされます。gvm の GOPATH と pkgset の機能は modules によりほぼ廃れています。asdf は Go を他のランタイムと一緒に1つのファイルに固定しておくため、ポリグロットなパイプラインではより整理されます。gvm が適合するのは古い Go ワークフローを保守する場合のみです。
高速化
go.sum をキーに、Go のインストールと module の cache を保存しましょう。どちらも CI runner 上で動作し、より高速なマネージド runner は Go のインストール、build、test の手順を短縮します。
結論
GOPATH や pkgset に依存するレガシーな Go プロジェクトを保守するなら gvm。modules ベースのモダンなリポジトリで Go を他の言語と並べて管理するなら asdf(または CI では setup-go)。今日の多くのチームには asdf か公式ツールチェーンがよりシンプルな選択です。