新調したMacBook Air(M3チップ)にGoの環境を整えたい; go: command not found; ERROR: Failed to download binary go
背景
- 転職するので、個人のパソコンも新調しました。MacBook Air M3 です
- 当方、Goに縁があるので、Goの環境整えたいです
Goのバージョンマネージャ
Goはパッケージマネージャは公式の go mod
を駆使したらいいんだと思うんですが、Go自体のバージョンマネージャはどれ使うんでしょうね。
わたしはこれ使いたいです。
モノとしても基本シェルスクリプトで、問題に直面してしまったときのコードリーディングも勉強になりそうですね。
直面した問題
まず、gvmのインストール
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
これが何をやっているかというと、このへんでgvmのrepo自体を$HOME以下に落としてきているのがわかる。
しかしこうやって見ると改めてインターネッツに置かれたシェルスクリプトを直接叩くのって怖いですね
で、
source ${HOME}/.gvm/scripts/gvm # すると、 which gvm # 読み込まれたシェルスクリプトが実体のため、 # gvm() { ... } というような関数の定義が出力される
いよいよGoのダウンロードと配置ですが、いったん、入手可能なGoのバージョンを確認したい
gvm listall
# リモートから入手可能なGoのバージョンがズラッと出力される
いったん、最近のstableでいいかなと思うので、1.22かなーと
% gvm install go1.22 Installing go1.22.0 as go1.22... * Compiling... /Users/otiai10/.gvm/scripts/install: line 93: go: command not found ERROR: Failed to compile. Check the logs at /Users/otiai10/.gvm/logs/go-go1.22-compile.log ERROR: Failed to use installed version %
go: command not found
Goをインストールしようとしているのに go
コマンドが無いと言われる。困った。
これはなぜかというと、GoのコンパイルにはGo自身が必要だからで、ここに詳しく説明されているっぽい
以下のような記述がある
The minimum version of Go required depends on the target version of Go:
- Go <= 1.4: a C toolchain.
- 1.5 <= Go <= 1.19: a Go 1.4 compiler.
- 1.20 <= Go <= 1.21: a Go 1.17 compiler.
- 1.22 <= Go <= 1.23: a Go 1.20 compiler.
Going forward, Go version 1.N will require a Go 1.M compiler, where M is N-2 rounded down to an even number. Example: Go 1.24 and 1.25 require Go 1.22.
今回、1.22を入れようとしているので、1.20のバイナリを、gvmを使って、直接ダウンロード+配置をすれば、bootstrap用のGoは手に入れられる気がする
解決
# gvmの --binary オプションを使う % gvm install go1.20 --binary Installing go1.20 from binary source % which go go not found # まだPATHが通ってないからしょうがない % gvm list gvm gos (installed) go1.20 % gvm use go1.20 Now using version go1.20 % which go /Users/otiai10/.gvm/gos/go1.20/bin/go % # PATH通ったので、 `go command not found` とは言われないはず
気を取り直して、1.22を、あらためて、ソースからインストールする
% gvm install go1.22 Installing go1.22.0 as go1.22... * Compiling... go1.22 successfully installed! % gvm list gvm gos (installed) => go1.20 go1.22 % gvm use go1.22 Now using version go1.22 % gvm alias default go1.22 ERROR: Unrecognized command line argument: 'default' # 違った % gvm use go1.22 --default Now using version go1.22 % gvm list gvm gos (installed) go1.20 => go1.22 % which go /Users/otiai10/.gvm/gos/go1.22/bin/go % go version go version go1.22.0 darwin/arm64 %
雑感
- とはいえ、Goを使う環境で、Go自体のバージョンを頻繁に切り替えたりするかなーしないだろうなーという気持ち
- なので、公式で紹介されているように、installerで欲しいバージョンのGoをインストールし、その後のバージョンは、そのGoを使って
go install golang.org/dl/go1.23@latest
みたいにしていくのがいいんじゃ無いかなとも思う
- なので、公式で紹介されているように、installerで欲しいバージョンのGoをインストールし、その後のバージョンは、そのGoを使って
- やはり技術が好きなので、これからのキャリアは技術に戻して行こうと思っている
- だけど、なんかやってることが3年前と進歩が無い
- 最初はしょうがないと思って、楽しみながら、リハビリしていきたい
DRYな備忘録として