これは、なにをしたくて書いたもの?
Goはapt(+PPA)でインストールしているのですが、他のバージョンが使いたくなる時もあったりします。
Ubuntu · golang/go Wiki · GitHub
こういう時はどうしたらいいのかな?と思ったのですが、Go自体が複数バージョンのGoをインストールする方法をドキュメントに
書いていますね。
Managing Go installations - The Go Programming Language
調べている過程でgvmやgoenvというのも見つけましたが、こちらはあまり更新されていなさそう。
GitHub - moovweb/gvm: Go Version Manager
GitHub - syndbg/goenv: Like pyenv and rbenv, but for Go.
gvmは、SDKMANが名前を変えた理由だったような?
Home - SDKMAN! the Software Development Kit Manager
ちょっと蛇足ですね。
環境
今回の環境は、こちら。
$ go version go version go1.16 linux/amd64
あらかじめPPAを追加してインストールしたGoがある環境です。
Ubuntu · golang/go Wiki · GitHub
複数バージョンのGoをインストールする
では、Goの他のバージョンをインストールしてみましょう。方法としては、以下のドキュメントに従います。
Managing Go installations / Installing multiple Go versions
実行するコマンドとしては、以下になります。
$ go get golang.org/dl/go[Goのバージョン] $ go[Goのバージョン] download
Goのバージョンは、ダウンロードページなどから探したらよいでしょう。
Downloads - The Go Programming Language
ここからは、実際に他のバージョンのGoをインストールしてみます。今回は、1.15.7と1.14.15(それぞれ1.15、1.14系の現時点での
最新バージョン)をインストールしてみましょう。
go get
でGo 1.15.7をインストールします。GO111MODULE=on
は、なんとなく付けておきました…。
$ GO111MODULE=on go get golang.org/dl/go1.15.7 go: downloading golang.org/dl v0.0.0-20210220033039-562909534da3
これで、以下のようにパスを通していればgo1.15.7
というコマンドが使えるようになります。
export PATH=${HOME}/go/bin:${PATH}
ですが、この時点ではまだ指定のバージョンのGoは使えるようになっていません。
$ go1.15.7 version go1.15.7: not downloaded. Run 'go1.15.7 download' to install to $HOME/sdk/go1.15.7
download
が必要です。
$ go1.15.7 download
ダウンロードの様子。
$ go1.15.7 download Downloaded 0.0% ( 16384 / 121031670 bytes) ... Downloaded 3.5% ( 4210688 / 121031670 bytes) ... Downloaded 11.3% ( 13664256 / 121031670 bytes) ... Downloaded 19.8% ( 23953408 / 121031670 bytes) ... Downloaded 28.3% ( 34242560 / 121031670 bytes) ... Downloaded 36.3% ( 43876352 / 121031670 bytes) ... Downloaded 44.2% ( 53477376 / 121031670 bytes) ... Downloaded 52.6% ( 63635456 / 121031670 bytes) ... Downloaded 60.8% ( 73596928 / 121031670 bytes) ... Downloaded 68.7% ( 83197952 / 121031670 bytes) ... Downloaded 76.4% ( 92504064 / 121031670 bytes) ... Downloaded 82.9% (100368384 / 121031670 bytes) ... Downloaded 88.5% (107070216 / 121031670 bytes) ... Downloaded 95.9% (116114184 / 121031670 bytes) ... Downloaded 100.0% (121031670 / 121031670 bytes) Unpacking $HOME/sdk/go1.15.7/go1.15.7.linux-amd64.tar.gz ... Success. You may now run 'go1.15.7'
これで、Go 1.15.7が使えるようになります。
$ go1.15.7 version go version go1.15.7 linux/amd64
Go 1.14.15もダウンロードしてみましょう。
$ GO111MODULE=on go get golang.org/dl/go1.14.15 $ go1.14.15 download
確認。
$ go1.14.15 version go version go1.14.15 linux/amd64
インストール先を確認する
それぞれのコマンドの場所を確認してみます。
$ which go /usr/bin/go $ which go1.15.7 $HOME/go/bin/go1.15.7 $ which go1.14.15 $HOME/go/bin/go1.14.15
繰り返しますが、Go 1.16(which go
の結果)だけは、aptでインストールしたものです。
各GoのGOROOT
環境変数を見ると、対象のGoがインストールされている場所を確認できます。
$ go env GOROOT /usr/lib/go-1.16 $ go1.15.7 env GOROOT $HOME/sdk/go1.15.7 $ go1.14.15 env GOROOT $HOME/sdk/go1.14.15
go get golang.org/dl/go[Goのバージョン]
でダウンロードしたものは$HOME/go/bin
に配置され、go[Goのバージョン] download
で
保存したものは$HOME/sdk
にインストールされます、と。
$HOME/sdk
ディレクトリの中身も見ておきます。
$ ll $HOME/sdk 合計 16 drwxr-xr-x 4 xxxxx xxxxx 4096 2月 23 19:15 ./ drwxr-xr-x 6 xxxxx xxxxx 4096 2月 23 19:12 ../ drwxr-xr-x 10 xxxxx xxxxx 4096 2月 23 19:15 go1.14.15/ drwxr-xr-x 10 xxxxx xxxxx 4096 2月 23 19:12 go1.15.7/
確かに、各バージョンのGoがあります。
プログラムを動かしてみる
version
コマンドだけでの確認もなんなので、プログラムも動かしておきましょう。
使用しているGoのバージョンを表示するものがよいですね、こちらを使いましょう。
Package runtime / func Version() string
こんなプログラムを用意。
main.go
package main import ( "fmt" "runtime" ) func main() { fmt.Printf("Hello Go: %s\n", runtime.Version()) }
確認。
$ go run main.go Hello Go: go1.16 $ go1.15.7 run main.go Hello Go: go1.15.7 $ go1.14.15 run main.go Hello Go: go1.14.15
OKそうですね。
アンインストール
アンインストール方法もドキュメントに記載があります。
Managing Go installations / Installing multiple Go versions
今回の方法でインストールした場合は、以下は違いますね…。
Managing Go installations / Uninstalling Go
今回インストールした、Go 1.14.15をアンインストールしましょう。以下のコマンドでアンインストールできます。
$ rm $HOME/go/bin/go1.14.15 $ rm -rf $HOME/sdk/go1.14.15
つまり、
$ rm $HOME/go/bin/go[Goのバージョン] $ rm -rf $HOME/sdk/go[Goのバージョン]
ですね。
こんな感じでしょうか。覚えておきましょう。