最近ちょいちょいGoで遊んでいます。 その際に、環境構築周りでなんとなく作ったルールがあるので紹介します。
処理系は~/local/にインストールする
インストール用のスクリプト1でビルドしてインストールを行います。 実行すると自動的にGo-1.4.2をユーザランドにインストールします。 なお、GOROOTは基本的にGoのバイナリに組み込まれていますが、常に指定するようにしています。
yaourt -Sy go とかで入れるのは楽なんですが、ここは好みですね。
依存関係のライブラリは、各プロジェクトディレクトリ以下にインストールする
個人的にはこれすごい大事で、各プロジェクトごとの依存関係を管理するのに役立ちます。 ~/.go/等に複数のプロジェクトの依存関係を入れてしまうと、他のプロジェクトのために入れたpackageの影響でビルドがコケたりコケなかったりします。 各プロジェクトごとにGOPATHを切っておくと、そのへんの確認であったり管理が楽になります2。
export GOPATH=$(pwd)/.go/ してから go get github.com/some/thing とかすると、.go/以下にインストールされます。
Goはとてもクロスコンパイルが簡単なので、可能な限りCIサービスと連携して複数プラットフォーム用のバイナリを吐いておく
開発というより、使ってもらう際の利点となります。 よくある「linuxはビルド簡単にできるからいいんだけど、windowsでビルドするのたるい…」という状況を軽減できます。 Goはクロスコンパイルが死ぬほど楽なので、 .travis.yml 等からクロスコンパイルする設定を入れておくと、簡単に他の人に試してもらうことができるので楽です。
以上のルールにより、以下のご利益があります。
- 複数のプロジェクト間で依存関係が切り分けることができる
Goの複数バージョンを簡単に変更できる
要するに*env系が中でやってることをそのままやる感じですけど、現状Goに決定版のようなツールはないため、当面このやり方でいくか、または何か作ろうかと思ってます。 ただし、GOROOTはバイナリに埋め込まれるため、単にPATHの切り替えだけでいいのですが、まぁ面倒なので。
便利
みんなGoやればいいと思うよ。 私はGoやって楽しいです。(構文はちょっと好みではないけど。)
付録
Goの環境変数
GOROOT
Goの処理系をインストールしたディレクトリを指定する。 Goのバイナリ中に埋め込まれるため、bashから echo $GOROOT して何も表示されなくても、 echo $(go env GOROOT) すると表示されるかと思います。 Goの標準packageは $GOROOT 以下に入っています。
GOPATH
標準packageでないpackageがインストールされるディレクトリを指定します。 go get hoge/fuga とすると、 $GOPATH/src/ 以下にpackageがインストールされます。 また、 $GOPATH/bin/ 以下には、 go get で入れたpackageのバイナリが格納されます。
Goのインストールスクリプト
pushd $TEMP
# github releasesはリダイレクションされるため、-Lをつける必要がある
curl -o go1.4.2.tar.gz -L https://github.com/golang/go/archive/go1.4.2.tar.gz
tar -xzvf go1.4.2.tar.gz
if [ ! -d ~/local/go/ ]; then
mkdir -p ~/local/go/
fi
mv go-go1.4.2/ ~/local/go/1.4.2/
popd
if [ ! -f ~/local/go/default/ ]; then
ln -s ~/local/go/1.4.2/ ~/local/go/default/
fi
export GOROOT=~/local/go/default/
export PATH=$GOROOT/bin/:$PATH
pushd ~/local/go/1.4.2/src/
./make.bash
popd