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
アーカイブは66MB程度です。
ダウンロードしたファイルのある場所でコマンド実行します。
tar xzf go1.22.4.linux-amd64.tar.gz
ホームディレクトリに「go/」フォルダが作成され、その中に内容が展開されます。
「go/bin」にパスを通します。
「~/.bashrc」に追記します。
export PATH=$PATH:~/go/bin
追記した内容を現在のシェルに反映します。
source ~/.bashrc
goのバージョンを表示してみます。
go version
warningが表示されますが、現時点ではとりあえず無視してください。
手作業で他のバージョンをインストールする
では、公式ドキュメントの説明通りにバージョン「1.21.11」を手作業で追加インストールしてみます。
ユーザーのホームディレクトリでコマンド実行します。
go install golang.org/dl/go1.21.11@latest
「~/go/pkg/mod」
「~/go/pkg/sumdb」
「~/go/bin/go1.21.11」
が作成されます。
ここで作成された「go1.21.11」は実行マネージャーのようなもので、
実行環境はこれからダウンロードします。
go1.21.11 download
「~/sdk/」が作成され、その中に各バージョンの実行環境が展開されます。
バージョンを表示させてみます。
go1.21.11 version
一応、これで実行できる状態です。
が、実行コマンドは「go」でいきたいですよね。
kane8n/govsインストール
複数バージョンを、現状インストールできるアーカイブバージョンのリストから選択してインストールできるCLIツール「kane8n/govs」をインストールしていきます。
git clone https://github.com/kane8n/govs.git
cd govs
make install
「~/govs/」は削除して構いません。
cd ~/
rm -rf govs
「~/.govs/bin」に実行ファイルが作成されています。
ここにパスを通し、実行用のコマンドエイリアスを作成します。
「~/.bashrc」に次の2行を追記します。
alias govs="source _govs"
export PATH=$PATH:~/.govs/bin
現在のシェルに設定を反映させます。
source ~/.bashrc
kane8n/govsで他のバージョンをインストール
インストールしたツールで他のバージョンをインストールしてみます。
※注:このツールでインストールできるのは最新版ではなく「アーカイブバージョン」です。
govs install
Go公式ダウンロードページにある「Archived versions」の一覧が表示されます。
アーキテクチャは自動判定で選択してくれます。
「1.20.14」を選択してインストールしてみます。
※リストが多いので選ぶのも一苦労です。
※フィルター機能あるいは検索機能があれば良いのですが。
[↓][↑]キーで「1.20.14」を選択して[Enter]で確定します。
インストールするか訊かれるので「y」を入力して[Enter]で確定します。
「go/bin/go1.20.14」と「sdk/go.1.20.14」が作成されています。
バージョン切替関数作成
バージョンの切替をするための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
バージョン指定で最新版をインストールしておく
switchROOT関数の難点というか課題はいくつかありますが、
最大のポイントは元のバージョンに戻すことが出来ない点です。
元のデフォルトバージョンをバージョン指定でインストールしておけば、
バージョン指定で元のバージョンに戻すことが可能です。
今回の例だと、最初にインストールしたデフォルトバージョンは「1.22.4」です。
前述の方法で、コマンドでインストールしておきます。
go install golang.org/dl/go1.22.4@latest
go1.22.4 download
バージョンを切替してみます。
switchGOROOT 1.22.4
残課題
- デフォルトでwarningが出る(筆者は放置派)
- インストール済バージョン一覧→「ls -1 ~/sdk」で代用
- switchGOROOTのエラーハンドリング(例:指定バージョンが無い場合。bashのエラーで実行中止されるので放置でも問題なし。プログラマー的には気持ち悪い。)
- デフォルトバージョン指定→「default_version」のようなテキストファイルにバージョン記録(このbash関数も欲しい)しておいてshell起動時にswitchGOROOTさせればいけると思う。今回は放置。
- アンインストール→「~/sdk/」配下の該当バージョンフォルダ削除&「~/go/bin/」配下の該当バージョン削除で代用。削除後にswitchGOROOT実行。
上記残課題への対応は別記事にしました。
コメント