Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

Mac上にGoのバージョン管理ツールgvmをインストールしてみた

追記(2017/04/19): MacOS Sierraだとコンパイルに使用するGo 1.4が動作しないため失敗するらしいです

公式のバイナリpkgならうまくいきます

Downloads - The Go Programming Language


仕事でGoを使う機会に巡り会えそうだったので、ちょっとフライング気味に勉強してみることにしました
となるとやはり初めはバージョン管理ツールの導入なのだが、Go界隈の流行りはどうなっているんだろう

調べる感じRubyとかほどバージョン管理ツールは使われていないのかな?情報が少ない印象を受けました

お馴染みの命名規則でgoenvとかgvmとかいったものがあるらしいですがGoogle トレンドを見る感じでは、gvmのほうが使われている印象を受けました(データ量が少ないけど・・)

https://www.google.co.jp/trends/explore?date=today%2012-m&geo=JP&q=goenv,gvm

同名のgoenvでこんなのもありましたが、こっちはプロジェクト作成ツールっぽい?(あとで見る)

という訳で一旦gvmを使うことに決定しました!

導入済みのanyenvは名前の通りgoenvしか使えないので一からインストールします

Macにgvmをインストールする

とりあえず先に依存ツールをすべてインストールします

xcode-select --install
brew update
brew install mercurial

本体のインストールは以下のコマンドです(zshの人は先頭の"bash"を"zsh"にしてください)

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

もしzshを使用しているのに間違えてbashで実行してしまったら
"ERROR: Already installed!"
と表示されてインストールできなくなってしまいます
そのときは一旦、"~/.gvm/"ディレクトリを削除してください

ターミナルを再起動するか下記を実行してgvmコマンドを実行できるようにします

source ~/.gvm/scripts/gvm

これにてgvm本体のインストールは完了です

$ gvm version
Go Version Manager v1.0.22 installed at ~/.gvm

Go 1.6をインストールする

参考にした書籍が1.6を推奨していたので1.6.3をインストールしようとしましたが・・

$ gvm install go1.6.3
Downloading Go source...
Installing go1.6.3...
 * Compiling...
ERROR: Failed to compile. Check the logs at ~/.gvm/logs/go-go1.6.3-compile.log
ERROR: Failed to use installed version

エラー通り".gvm/logs/go-go1.6.3-compile.log"を見てみます

##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find ~/.gvm/gos/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.

どうやら1.5からはセルフホスティングされているため、ビルドに1.4以上が必要らしいです

そこで1.4をインストールしようとしましたが・・

$ gvm install go1.4
Installing go1.4...
 * Compiling...
ERROR: Failed to compile. Check the logs at ~/.gvm/logs/go-go1.4-compile.log
ERROR: Failed to use installed version

エラー通り"~/.gvm/logs/go-go1.4-compile.log"を見てみます

# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, darwin/amd64.
lib9
libbio
liblink
cmd/cc
cmd/gc
cmd/6l
cmd/6a
cmd/6c
~/.gvm/gos/go1.4/src/cmd/6c/txt.c:995:28: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
~/.gvm/gos/go1.4/src/cmd/6c/txt.c:1045:28: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
go tool dist: FAILED: clang -Wall -Wstrict-prototypes -Wextra -Wunused -Wno-sign-compare -Wno-missing-braces -Wno-parentheses -Wno-unknown-pragmas -Wno-switch -Wno-comment -Wno-missing-field-initializers -Werror -fno-common -ggdb -pipe -Wuninitialized -O2 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -mmacosx-version-min=10.6 -c -m64 -I ~/.gvm/gos/go1.4/include -I ~/.gvm/gos/go1.4/src/cmd/6c -o ~/.gvm/gos/go1.4/pkg/obj/cmd/6c/txt.o ~/.gvm/gos/go1.4/src/cmd/6c/txt.c

上のIssueを見る感じMacだとインストールできないとかなんとか(ちゃんと読んでいないです)

そこでバイナリからインストールします

gvm install go1.4 -B
gvm use go1.4
export GOROOT_BOOTSTRAP=$GOROOT

改めて1.6.3をインストールします

gvm install go1.6.3
gvm use go1.6.3

ようやく無事にインストールできた模様フー ( ̄‥ ̄) = =3

$ gvm list

gvm gos (installed)

   go1.4
=> go1.6.3
   system

Hello World!

最後にちょろっとHello World!だけ動かしてみました

package main

import (
  "fmt"
)

func main() {
  fmt.Println("Hello World!")
}
$ go run hello.go
Hello World!

コンパイラ言語なのにこの手軽さはいいですね!!

参考URL