【Go言語】複数バージョンの切替(残課題対応)

Go言語

前回の記事「【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

このコマンドはデフォルトバージョンの設定をするだけです。

設定内容は「~/.go_default_version」に記録されます。

バージョンの切替はしません。

バージョンの切替は「switchGOROOT」の役割となります。

インストールしていないバージョンを指定した場合の挙動も確認しておきましょう。

set-go-default 1.hoge

仕様通り、エラー終了しています。

対策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

仕様通り、一覧が表示されました。

「~/sdk」が存在しない場合の挙動も確認しておきます。

※一時的に「~/sdk」の名称を変更してから実行し、実行後に元に戻しておきます。

仕様通り、存在しない場合はエラー表示されました。

対策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

デフォルトの「1.21.11」から「1.20.14」に切り替わりました。

では、存在しないバージョンを指定したときの挙動も確認してみます。

仕様通り、エラー終了しました。

対策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

「1.19.13」だけがアンインストールされました。

今度は、「1.20.14」をデフォルトに指定してから「1.20.14」をアンインストールしてみます。

set-go-default 1.20.14
go-uninstall 1.20.14

「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

上記スクリプトが実行され、「~/.go_default_version」の内容が反映されました。

ただし、WSL2経由のUbuntuの場合、デフォルトの設定だと、一度ターミナルを全閉じしてから、Ubuntuターミナルを開いた(WSL2経由でUbuntu再起動した)とき、「~/.bashrc」が読み込まれない問題が発生します。

対処方法はいくつかありますが、

ここでは、「~/.bash_profile」に追記で対応します。

▼「~/.bash_profile」の最上部に追記

if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

以上です。

コメント

タイトルとURLをコピーしました