LoginSignup
19
17

More than 5 years have passed since last update.

複数のバージョンのGoを簡単に切り替える方法

Posted at

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

もっといい方法を知っている方はコメントで教えてください。こちらからは以上です。

19
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17