前回の記事「【Go言語】複数バージョンのインストールと切替」の残課題への対応をまとめて対応しました。
残課題の確認
👀 課題1.デフォルトでwarningが出る
👀 課題2.インストール済バージョン一覧表示
👀 課題3.switchGOROOTのエラーハンドリング(例:指定バージョンが無い場合)
👀 課題4.デフォルトバージョン指定
👀 課題5.アンインストール
これからやること
🎯対策1.デフォルトバージョン指定関数作成
→課題4を解消
🎯対策2.インストール済バージョン一覧表示関数作成
→課題2を解消
🎯対策3.switchGOROOTエラーハンドリング
→課題3を解消
🎯対策4.アンインストール関数作成
→課題5を解消
🎯対策5.シェル起動時にデフォルトバージョンを反映
→課題1を解消
対策1.デフォルトバージョン指定関数作成
▼仕様概要
項目 | 内容 |
---|---|
実装手法 | bash関数 |
関数名 | set-go-default |
引数 | バージョン名 |
オプション | なし |
バージョン書式 | x.y.z (x,y,zは数値) |
バージョンチェック | 存在しなければエラー終了 |
保存場所 | ~/.go_default_version |
使用例 | set-go-default 1.22.4 |
~/.bashrc に追記します。
set-go-default() {
if [ ! -d ~/sdk/go$1 ]; then
echo "specified version $1 is not installed."
echo "operation aborted."
return 1
fi
echo $1 > ~/.go_default_version
echo "The default go version has been set to `cat ~/.go_default_version`"
}
現在のシェルに変更を反映します。
source ~/.bashrc
デフォルトバージョンを「1.21.11」に設定してみます。
set-go-default 1.21.11
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_01.png)
このコマンドはデフォルトバージョンの設定をするだけです。
設定内容は「~/.go_default_version」に記録されます。
バージョンの切替はしません。
バージョンの切替は「switchGOROOT」の役割となります。
インストールしていないバージョンを指定した場合の挙動も確認しておきましょう。
set-go-default 1.hoge
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_02.png)
仕様通り、エラー終了しています。
対策2.インストール済バージョン一覧表示関数作成
▼仕様概要
項目 | 内容 |
---|---|
実装手法 | bash関数 |
関数名 | go-verions |
引数 | なし |
オプション | なし |
処理 | 「~/sdk」内のエントリーを表示 |
チェック | 「~/sdk」が無い場合はエラー表示 |
使用例 | go-versions |
「~/.bashrc」に追記します。
go-versions() {
if [ -d ~/sdk ]; then
ls -1 ~/sdk
else
echo "no versions installed in ~/sdk."
fi
}
現在のシェルに変更を反映します。
source ~/.bashrc
実行してみます。
go-versions
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_03.png)
仕様通り、一覧が表示されました。
「~/sdk」が存在しない場合の挙動も確認しておきます。
※一時的に「~/sdk」の名称を変更してから実行し、実行後に元に戻しておきます。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_04.png)
仕様通り、存在しない場合はエラー表示されました。
対策3.switchGOROOTエラーハンドリング
※筆者的には、小文字+連続大文字が入力しにくく嫌なので、
※全て小文字のケバブケースに関数名を変更します。
▼仕様概要
項目 | 内容 |
---|---|
実装手法 | bash関数 |
関数名 | switch-go-root |
引数 | バージョン名 |
バージョン書式 | x.y.z (x,y,zは数値) |
オプション | なし |
バージョンチェック | 「~/sdk」に無い場合はエラー終了 |
処理内容 | 使用するバージョンを指定バージョンに切り替える |
使用例 | switch-go-root 1.21.11 |
「~/.bashrc」内の「switchGOROOT」関数の内容を次の内容で置換します。
switch-go-root() {
if [ ! -r ~/sdk/go$1 ]; then
echo "specified version $1 is not installed in ~/sdk."
echo "operation aborted."
return 1
fi
export GOROOT=`go$1 env GOROOT`
export PATH=$GOROOT/bin:$PATH
go version
}
変更を現在のシェルに反映します。
source ~/.bashrc
「1.21.11」から「1.20.14」にバージョンを変更してみます。
switch-go-root 1.20.14
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_05.png)
デフォルトの「1.21.11」から「1.20.14」に切り替わりました。
では、存在しないバージョンを指定したときの挙動も確認してみます。
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_06.png)
仕様通り、エラー終了しました。
対策4.アンインストール関数作成
▼仕様概要
項目 | 内容 |
---|---|
実装手法 | bash関数 |
関数名 | go-uninstall |
引数 | バージョン名 |
バージョン書式 | x.y.z (x,y,zは数値) |
オプション | なし |
処理内容 | 1.指定バージョンを「~/sdk」からフォルダごと削除 2.指定バージョンを「~/go/bin」から削除 3.「~/.go_default_version」が指定バージョンの場合は「~/.go_default_version」を削除しメッセージ表示 |
バージョンチェック | 1.「~/sdk」に無い場合はエラー表示 2.「~/go-bin」に無い場合はエラー表示 |
使用例 | go-uninstall 1.19.13 |
「~/.bashrc」に追記します。
go-uninstall() {
if [ -e ~/sdk/go$1 ]; then
echo "removing ~/sdk/$1..."
rm -rf ~/sdk/go$1
else
echo "~/sdk/go$1 not found."
fi
if [ -e ~/go/bin/go$1 ]; then
echo "removing ~/go/bin/go$1..."
rm -f ~/go/bin/go$1
else
echo "~/go/bin/go$1 not found."
fi
if [ -e ~/.go_default_version ]; then
if [ $1 = `cat ~/.go_default_version` ]; then
echo "removing ~/.go_default_version..."
rm ~/.go_default_version
fi
fi
}
変更を現在のシェルに反映します。
source ~/.bashrc
「1.19.13」をアンインストールしてみます。
go-uninstall 1.19.13
![](http://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_07.png)
「1.19.13」だけがアンインストールされました。
今度は、「1.20.14」をデフォルトに指定してから「1.20.14」をアンインストールしてみます。
set-go-default 1.20.14
go-uninstall 1.20.14
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_08.png)
「1.20.14」のアンインストールに加えて、「.go_default_version」も削除されました。
「1.22.4」をデフォルトに指定しなおしておきます。
set-go-default 1.22.4
対策5.シェル起動時にデフォルトバージョンを反映
▼仕様概要
項目 | 内容 |
---|---|
実装手法 | 「~/.bashrc」にスクリプト追記 |
処理内容 | 「~/.go_default_version」があれば 「~/.go_default_version」の内容を 引数としてswitch-go-root実行 |
「~/.bashrc」に追記します。
if [ -r ~/.go_default_version ]; then
switch-go-root `cat ~/.go_default_version`
fi
変更を現在のシェルに反映してみます。(上記スクリプトが実行されます)
source ~/.bashrc
![](https://macocci7.net/blog/wp-content/uploads/2024/06/golang_multiple_versions_countermeasure_09.png)
上記スクリプトが実行され、「~/.go_default_version」の内容が反映されました。
ただし、WSL2経由のUbuntuの場合、デフォルトの設定だと、一度ターミナルを全閉じしてから、Ubuntuターミナルを開いた(WSL2経由でUbuntu再起動した)とき、「~/.bashrc」が読み込まれない問題が発生します。
対処方法はいくつかありますが、
ここでは、「~/.bash_profile」に追記で対応します。
▼「~/.bash_profile」の最上部に追記
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
以上です。
コメント