【Go言語】複数バージョンのインストールと切替

Go言語

Go言語の複数バージョンをインストールする方法の解説です。

Managing Go installations - The Go Programming Language

前提条件

  • Ubuntu(WSL2)にインストールしていきます
  • gitインストール済
  • goはインストールされていない

インストールポリシーの確認

開発環境の自分のユーザーだけ使えればOKなので、

一般ユーザーのホームディレクトリにインストールします。

また、コマンドでも複数バージョンインストール&バージョン切替できますが、

面倒なのでツールと関数を使います。

項目内容
インストール先~/go/
インストールツールkane8n/govs
バージョン切替bash関数

デフォルト実行環境構築

まずは、デフォルトのGo実行環境を作るために、

公式サイトから適当なバージョンをダウンロードしてきます。

All releases - The Go Programming Language

今回はとりあえず執筆時点での最新版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」を手作業で追加インストールしてみます。

Managing Go installations - The Go Programming Language

ユーザーのホームディレクトリでコマンド実行します。

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」をインストールしていきます。

GitHub - kane8n/govs: Golang Version Switcher
Golang Version Switcher. Contribute to kane8n/govs development by creating an account on GitHub.
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」の一覧が表示されます。

All releases - The Go Programming Language

アーキテクチャは自動判定で選択してくれます。

「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実行。

上記残課題への対応は別記事にしました。

参考サイト

The Go Programming Language
Go is an open source programming language that makes it simple to build secure, scalable systems.
Goの複数バージョンをインストールして切り替える - Qiita
この記事はZOZO AdventCalender 2023シリーズ4の6日目の記事です。始めにgo言語で複数バージョンをPCにインストールして切り替える方法について説明します。なおgo言語ではGo1.x系の間には後方互換性を破壊するような変...
bashとzshで重複したPATH内のエントリ削除 - Qiita
設定ファイル内で環境変数PATHの重複を削除する方法。よく見かけるパターンだと、パスに空白が含まれていたらそこで分割されてしまうPATH=""だとエラーが生じるpathmergeのような専用…

コメント

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