Golangで謎エラーが出た
MacでGoをアップデートしたら、見たことないエラーが出てきてびっくりしたのでその話。
なんかgoがビルドできないんだけど、なにこの症状 pic.twitter.com/zARlo8ef31
— しゅもん (@shumon_84) 2018年5月16日
謎エラーが出た
$ cat hello.go package main import "fmt" func main() { fmt.Printf("hello world\n") }
こんな感じのHello Worldを書いてビルドすると、
$ go run hello.go # errors compile: version "go1.10" does not match go tool version "go1.10.2" # internal/race compile: version "go1.10" does not match go tool version "go1.10.2" # runtime/internal/sys compile: version "go1.10" does not match go tool version "go1.10.2" # runtime/internal/atomic compile: version "go1.10" does not match go tool version "go1.10.2" # unicode/utf8 compile: version "go1.10" does not match go tool version "go1.10.2" # internal/cpu compile: version "go1.10" does not match go tool version "go1.10.2" # unicode compile: version "go1.10" does not match go tool version "go1.10.2" # sync/atomic compile: version "go1.10" does not match go tool version "go1.10.2"
とりあえずversionがあってないっぽいので本能に従って
$ brew upgrade go
Error: go 1.10.2 already installed
まあアプデしたばっかりで当然最新バージョンなので、アプデはできず。
検索しても、いまいち同じ症状で悩んでる人が見つからなくて八方塞がり感があった。
治った
再インストールしてみたら原因がわかった。
$ brew uninstall --force go $ brew install go $ go run hello.go go: cannot find GOROOT directory: /usr/local/Cellar/go/1.10/libexec $ ls /usr/local/Cellar/go 1.10.2
あーーーー!GOROOTミスってるだけやん!!
というわけでGOROOT設定しなおしてみる。
$ export GOROOT="/usr/local/Cellar/go/1.10.2/libexec" $ go run hello.c hello world
普通に動いた。
原因はHomebrew
今回のはHomebrewが悪さをしていたみたい。
Homebrewはインストールしたパッケージはデフォルトでは
/usr/local/Cellar
に保存するんですが、バージョンが違うパッケージはバージョンごとに保存してしまうので、今回みたいなことが起こります。
gccとかのデカいパッケージは古いバージョンも丸々残っていると、容量めちゃくちゃ食うから定期的に使わない古いバージョンは消しておきたいね(自分の環境ではこれだけで2GBくらい空き容量が増えた)
対策
これで環境変数が崩れるのはGo関係なくヤバさがあるので、さすがにHomebrew害悪過ぎでしょって思っていたら、Homebrewはちゃんとそれぞれの最新バージョンのシンボリックリンクを貼ってくれるらしいです。
/usr/local/bin /usr/local/lib /usr/local/opt
このあたりにシンボリックリンクが貼られます。
export GOROOT="/usr/local/opt/go/libexec"
これを~/.bashrcに書いておけば、今後アップデートしてもちゃんと使えそう。
まとめ
今回はHomebrewを使っていく上で、Goだけじゃなくていろんな場面で関係してくるエラーで、Homebrewのディレクトリ構成についてちょっぴり詳しくなれたので、学びのあるトラブルシューティングになって良かった。
でも同じことで悩んでる人普通にたくさんいそうだけど、なんで検索しても情報出てこなかったんだろう。