DRYな備忘録

Don't Repeat Yourself.

新調したMacBook Air(M3チップ)にGoの環境を整えたい; go: command not found; ERROR: Failed to download binary go

背景

  • 転職するので、個人のパソコンも新調しました。MacBook Air M3 です
  • 当方、Goに縁があるので、Goの環境整えたいです

Goのバージョンマネージャ

Goはパッケージマネージャは公式の go mod を駆使したらいいんだと思うんですが、Go自体のバージョンマネージャはどれ使うんでしょうね。 わたしはこれ使いたいです。

github.com

モノとしても基本シェルスクリプトで、問題に直面してしまったときのコードリーディングも勉強になりそうですね。

直面した問題

まず、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自身が必要だからで、ここに詳しく説明されているっぽい

go.dev

以下のような記述がある

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 みたいにしていくのがいいんじゃ無いかなとも思う
  • やはり技術が好きなので、これからのキャリアは技術に戻して行こうと思っている
  • だけど、なんかやってることが3年前と進歩が無い
  • 最初はしょうがないと思って、楽しみながら、リハビリしていきたい

DRYな備忘録として