goの開発環境を整える

最近ちょいちょいGoで遊んでいます。 その際に、環境構築周りでなんとなく作ったルールがあるので紹介します。

  1. 処理系は~/local/にインストールする

    インストール用のスクリプト1でビルドしてインストールを行います。 実行すると自動的にGo-1.4.2をユーザランドにインストールします。 なお、GOROOTは基本的にGoのバイナリに組み込まれていますが、常に指定するようにしています。

    yaourt -Sy go とかで入れるのは楽なんですが、ここは好みですね。

  2. 依存関係のライブラリは、各プロジェクトディレクトリ以下にインストールする

    個人的にはこれすごい大事で、各プロジェクトごとの依存関係を管理するのに役立ちます。 ~/.go/等に複数のプロジェクトの依存関係を入れてしまうと、他のプロジェクトのために入れたpackageの影響でビルドがコケたりコケなかったりします。 各プロジェクトごとにGOPATHを切っておくと、そのへんの確認であったり管理が楽になります2

    export GOPATH=$(pwd)/.go/ してから go get github.com/some/thing とかすると、.go/以下にインストールされます。

  3. Goはとてもクロスコンパイルが簡単なので、可能な限りCIサービスと連携して複数プラットフォーム用のバイナリを吐いておく

    開発というより、使ってもらう際の利点となります。 よくある「linuxはビルド簡単にできるからいいんだけど、windowsでビルドするのたるい…」という状況を軽減できます。 Goはクロスコンパイルが死ぬほど楽なので、 .travis.yml 等からクロスコンパイルする設定を入れておくと、簡単に他の人に試してもらうことができるので楽です。

以上のルールにより、以下のご利益があります。

  1. 複数のプロジェクト間で依存関係が切り分けることができる
  2. Goの複数バージョンを簡単に変更できる

    要するに*env系が中でやってることをそのままやる感じですけど、現状Goに決定版のようなツールはないため、当面このやり方でいくか、または何か作ろうかと思ってます。 ただし、GOROOTはバイナリに埋め込まれるため、単にPATHの切り替えだけでいいのですが、まぁ面倒なので。

  3. 便利

みんな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

  1. Goならそういう管理いらないよ!という意見は欲しい。そこまで把握できている訳ではないので。 [return]
  2. Goならそういう管理いらないよ!という意見は欲しい。そこまで把握できている訳ではないので。 [return]
comments powered by Disqus