1.3や1.4など、複数のバージョンのGoを切り替えてビルドしたいという状況は(たまに)あると思います。
そんなとき、gvmやgobrewなどバージョン管理ツールを試してみましたが上手く行きませんでした。
- gvmは~/.gvm配下に
$GOPATH
が持っていかれてしまい、もともとの$GOPATH配下のワーキングディレクトリのプロジェクトをビルドできない - gobrewは1.2までしか対応していないようだった
やはり安易にサードパーティツール頼るのではなくGo単体でなんとかするのがGo wayかもしれない…。そこで、go単体でうまいこと複数goバージョンを切り替える方法を調べました。
方法
既に/usr/local/go あたりに普段使いのgoがインストールされている前提で、ビルド用に複数バージョンをインストールして切り替える、というユースケースで説明します。
手順1. 複数バージョンのGoをインストールする
何はなくともインストールです。
アーカイブからでもソースコードからでもいいですが、Downloads - The Go Programming Language からgoをダウンロードしてきて別々のディレクトリにインストールします。Macのpkgインストーラではインストール先ディレクトリが指定できなかったのでダメです。
# ここではgoコンパイラのインストール先を$GOPATH/gobinとします。
cd $GOPATH/gobin
# go1.4.1をインストール(アーカイブインストールする場合)
wget https://storage.googleapis.com/golang/go1.4.1.darwin-amd64-osx10.8.tar.gz
mkdir go1.4.1 && tar -C go1.4.1 -xzf go1.4.1.darwin-amd64.tar.gz
# go1.3.3をインストール(ソースインストールする場合)
wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz
mkdir go1.3.3 && tar -C go1.3.3 -xzf go1.3.3.src.tar.gz
cd go1.3.3/go/src ; ./all.bash ; cd ../../..
必要に応じてクロスコンパイルなども設定しておきましょう。
参考:Go のクロスコンパイル環境構築 - Qiita
手順2. ビルドに使うGoを使い分ける
以下のようにGOROOT環境設定つきでgobin以下にインストールしたgo buildを実行します。ポイントは -a
フラグです。goのオブジェクトファイルはメジャーバージョン間で互換性がなく、go1.3でビルドする時に$GOPATH/pkg
にgo1.4でビルドした.aファイルがあるとエラーになってしまうことがあります(必ずではない?)。-a
フラグで強制再ビルドをさせる事でこれを避ける事ができます。バージョンを切り替えたあとのビルドエラーにはこれで対処しましょう。
# Go1.3.3でビルド
GOROOT=$GOPATH/gobin/go1.3.3/go/ $GOPATH/gobin/go1.3.3/go/bin/go build -a
# Go1.4でビルド
GOROOT=$GOPATH/gobin/go1.4.1/go/ $GOPATH/gobin/go1.4.1/go/bin/go build -a
あとはそれぞれのgoにaliasでも貼っておきましょう。
# .zshrcに追加
alias go1.3.3="GOROOT=$GOPATH/gobin/go1.3.3/go/ $GOPATH/gobin/go1.3.3/go/bin/go"
alias go1.4.1="GOROOT=$GOPATH/gobin/go1.4.1/go/ $GOPATH/gobin/go1.4.1/go/bin/go"
これで go
go1.3.3
go1.4.1
を使い分ける事ができるようになりました。$GOPATHは共有しているので、ワーキングディレクトリが使えないという問題もありません。
$ go build
$ go1.3.3 build
$ go1.4.1 build
もっといい方法を知っている方はコメントで教えてください。こちらからは以上です。