Go言語の複数バージョンをインストールする方法の解説です。
前提条件
- Ubuntu(WSL2)にインストールしていきます
- gitインストール済
- goはインストールされていない
インストールポリシーの確認
開発環境の自分のユーザーだけ使えればOKなので、
一般ユーザーのホームディレクトリにインストールします。
また、コマンドでも複数バージョンインストール&バージョン切替できますが、
面倒なのでツールと関数を使います。
項目 | 内容 |
---|---|
インストール先 | ~/go/ |
インストールツール | kane8n/govs |
バージョン切替 | bash関数 |
デフォルト実行環境構築
まずは、デフォルトのGo実行環境を作るために、
公式サイトから適当なバージョンをダウンロードしてきます。
今回はとりあえず執筆時点での最新版1.22.4にします。
OSはUbuntu(Linux)、アーキテクチャは x86-64bitなので、
「go1.22.4.linux-amd64.tar.gz」をユーザーのホームディレクトリ「~/」にダウンロードします。
wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_01.png)
アーカイブは66MB程度です。
ダウンロードしたファイルのある場所でコマンド実行します。
tar xzf go1.22.4.linux-amd64.tar.gz
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_02.png)
ホームディレクトリに「go/」フォルダが作成され、その中に内容が展開されます。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_03.png)
「go/bin」にパスを通します。
「~/.bashrc」に追記します。
export PATH=$PATH:~/go/bin
追記した内容を現在のシェルに反映します。
source ~/.bashrc
goのバージョンを表示してみます。
go version
![](http://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_04.png)
warningが表示されますが、現時点ではとりあえず無視してください。
手作業で他のバージョンをインストールする
では、公式ドキュメントの説明通りにバージョン「1.21.11」を手作業で追加インストールしてみます。
ユーザーのホームディレクトリでコマンド実行します。
go install golang.org/dl/go1.21.11@latest
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_05.png)
「~/go/pkg/mod」
「~/go/pkg/sumdb」
「~/go/bin/go1.21.11」
が作成されます。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_06.png)
ここで作成された「go1.21.11」は実行マネージャーのようなもので、
実行環境はこれからダウンロードします。
go1.21.11 download
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_07.png)
「~/sdk/」が作成され、その中に各バージョンの実行環境が展開されます。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_08.png)
バージョンを表示させてみます。
go1.21.11 version
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_09.png)
一応、これで実行できる状態です。
が、実行コマンドは「go」でいきたいですよね。
kane8n/govsインストール
複数バージョンを、現状インストールできるアーカイブバージョンのリストから選択してインストールできるCLIツール「kane8n/govs」をインストールしていきます。
git clone https://github.com/kane8n/govs.git
cd govs
make install
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_11.png)
「~/govs/」は削除して構いません。
cd ~/
rm -rf govs
「~/.govs/bin」に実行ファイルが作成されています。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_12.png)
ここにパスを通し、実行用のコマンドエイリアスを作成します。
「~/.bashrc」に次の2行を追記します。
alias govs="source _govs"
export PATH=$PATH:~/.govs/bin
現在のシェルに設定を反映させます。
source ~/.bashrc
kane8n/govsで他のバージョンをインストール
インストールしたツールで他のバージョンをインストールしてみます。
※注:このツールでインストールできるのは最新版ではなく「アーカイブバージョン」です。
govs install
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_13.png)
Go公式ダウンロードページにある「Archived versions」の一覧が表示されます。
アーキテクチャは自動判定で選択してくれます。
「1.20.14」を選択してインストールしてみます。
※リストが多いので選ぶのも一苦労です。
※フィルター機能あるいは検索機能があれば良いのですが。
[↓][↑]キーで「1.20.14」を選択して[Enter]で確定します。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_14.png)
インストールするか訊かれるので「y」を入力して[Enter]で確定します。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_15.png)
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_16.png)
「go/bin/go1.20.14」と「sdk/go.1.20.14」が作成されています。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_17.png)
バージョン切替関数作成
バージョンの切替をするためのbashの関数を作成します。
「~/.bashrc」に次の内容を追記します。
switchGOROOT() {
export GOROOT=`go$1 env GOROOT`
export PATH=$GOROOT/bin:$PATH
go version
}
# PATHの重複削除
# 連想配列が使えるかどうかチェック
if typeset -A &>/dev/null; then
# 使える場合
typeset -A _paths
typeset _results
while read -r _p; do
if [[ -n ${_p} ]] && (( ${_paths["${_p}"]:-1} )); then
_paths["${_p}"]=0
_results=${_results}:${_p}
fi
done <<<"${PATH//:/$'\n'}"
PATH=${_results/:/}
unset -v _p _paths _results
else
# 使えない場合はawkで
typeset _p=$(awk 'BEGIN{RS=":";ORS=":"} !x[$0]++' <<<"${PATH}:")
PATH=${_p%:*:}
unset -v _p
fi
現在のシェルに設定を反映させます。
source ~/.bashrc
「1.20.14」にバージョンを切替してみます。
switchGOROOT 1.20.14
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_18.png)
バージョン指定で最新版をインストールしておく
switchROOT関数の難点というか課題はいくつかありますが、
最大のポイントは元のバージョンに戻すことが出来ない点です。
元のデフォルトバージョンをバージョン指定でインストールしておけば、
バージョン指定で元のバージョンに戻すことが可能です。
今回の例だと、最初にインストールしたデフォルトバージョンは「1.22.4」です。
前述の方法で、コマンドでインストールしておきます。
go install golang.org/dl/go1.22.4@latest
go1.22.4 download
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_19.png)
バージョンを切替してみます。
switchGOROOT 1.22.4
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_install_multiple_versions_20.png)
残課題
- デフォルトでwarningが出る(筆者は放置派)
- インストール済バージョン一覧→「ls -1 ~/sdk」で代用
- switchGOROOTのエラーハンドリング(例:指定バージョンが無い場合。bashのエラーで実行中止されるので放置でも問題なし。プログラマー的には気持ち悪い。)
- デフォルトバージョン指定→「default_version」のようなテキストファイルにバージョン記録(このbash関数も欲しい)しておいてshell起動時にswitchGOROOTさせればいけると思う。今回は放置。
- アンインストール→「~/sdk/」配下の該当バージョンフォルダ削除&「~/go/bin/」配下の該当バージョン削除で代用。削除後にswitchGOROOT実行。
上記残課題への対応は別記事にしました。
参考サイト
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9R28lRTMlODElQUUlRTglQTQlODclRTYlOTUlQjAlRTMlODMlOTAlRTMlODMlQkMlRTMlODIlQjglRTMlODMlQTclRTMlODMlQjMlRTMlODIlOTIlRTMlODIlQTQlRTMlODMlQjMlRTMlODIlQjklRTMlODMlODglRTMlODMlQkMlRTMlODMlQUIlRTMlODElOTclRTMlODElQTYlRTUlODglODclRTMlODIlOEElRTYlOUIlQkYlRTMlODElODglRTMlODIlOEImdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTI0NTkzODVjMjgzOGFlYWUyMGM4ZDY3YTUxYjA4MDZk&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBrYW5lOG4mdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTU4OGM4ZDIwYWRjODlmYTAxODU2ZDU2ZWRjZjA4OWIx&blend-x=120&blend-y=445&blend-mode=normal&txt64=aW4g5qCq5byP5Lya56S-Wk9aTw&txt-width=972&txt-clip=end%2Cellipsis&txt-color=%233A3C3C&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=134&txt-y=546&s=a98abd24da2817cf01155bd6e70dc15d)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9YmFzaCVFMyU4MSVBOHpzaCVFMyU4MSVBNyVFOSU4NyU4RCVFOCVBNCU4NyVFMyU4MSU5NyVFMyU4MSU5RlBBVEglRTUlODYlODUlRTMlODElQUUlRTMlODIlQTglRTMlODMlQjMlRTMlODMlODglRTMlODMlQUElRTUlODklOEElRTklOTklQTQmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTkyYWRjNGU1YThiODZjOTQxNmI5ODdhY2Q4ODRjZWJl&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBjYW1pc291bCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZmI4MTgxYjYzYTMwODBlZTVkMzI1NTdjNzVjMDk0YjE&blend-x=142&blend-y=486&blend-mode=normal&s=b57cecaa1e86fe068128b31f7a4d5b8b)
コメント