Mac上にGoの開発環境を構築する〜下準備編
同僚がGoを始める上で、案外まとまった資料が無さそうだったので書いてみることにしました。
Macでhomebrewが入っていることが前提です。事前に brew update
をおこない formula を最新のものにしておくと躓くことが少ないでしょう。
Goのインストール
% brew install go
エントリ執筆時点では、1.6.2 が入ります。Goはメジャーバージョンが同じ場合は、後方互換が保たれているので、基本的に新しいやつを入れて問題ありません。
環境変数の設定
$GOPATH
だけを決めればOKです。$GOPATH
はどこでも良いのですが、ここでは $HOME/dev
を $GOPATH
に設定します。また、 $GOPATH/bin
に $PATH
も通しておきます。
export GOPATH=$HOME/dev
export PATH=$GOPATH/bin:$PATH
今後Goの開発は全て $GOPATH
配下でおこなうことになります。
go getしてREPLを入れてみる
$GOPATH
を設定すると go get
ができるようになります。試しにGoのREPLである、gore
を入れてみましょう。
% go get github.com/motemen/gore
ついでに gore
の真価を発揮させるために、以下のパッケージも併せて入れましょう。
% go get github.com/nsf/gocode
% go get github.com/k0kubun/pp
% go get golang.org/x/tools/cmd/godoc
ちなみに、 go get
には -u
というオプションがあります。このオプションをつけないと、手元のパッケージが古くても更新をしてくれません。最新の状態にしたい場合には go get -u
を使うようにしましょう。
さて、これでおもむろに gore
とターミナルに打ち込んで起動すれば go get
成功です。
% gore
gore version 0.2.5 :help for help
gore>
Ctrl+dで終了します。
gore
は非常に便利で、特にGoに慣れないうちは、挙動の確認のために欠かせないツールです。
詳しくは作者のエントリをごらんください。 → コード補完もできる Go の REPL「gore」を作った
$GOPATH
の中を覗いてみる
さて、go get
をしたら $GOPATH
がどうなったかを見てみましょう。
% ls $GOPATH
bin/ pkg/ src/
$GOPATH
直下を見てみると、3つのディレクトリがあります。bin/ にはGo製ツールの実行ファイルが、src/ にはソースコードが配置されます。
src/ 以下を掘り下げて見てみましょう。
% tree -L 3 $GOPATH/src
$GOPATH/src
├── github.com
│ ├── k0kubun
│ │ └── pp
│ ├── mattn
│ │ └── go-colorable
│ ├── mitchellh
│ │ └── go-homedir
│ ├── motemen
│ │ ├── go-quickfix
│ │ └── gore
│ ├── nsf
│ │ └── gocode
│ └── peterh
│ └── liner
└── golang.org
└── x
└── tools
{{vcs_domain}}/{{repositry_path}} というような形で配置されていることがわかります。
Goは、GitやMercurialなどのリポジトリがパッケージになるという面白い特徴があります。また、 go get
で取得したソースコードには、GitやMercurialの履歴も含まれています。そのため、開発もその中でおこなうことができるのです。
ghq
を使いリポジトリ管理をより簡単にする
$GOPATH/src
のリポジトリ配置ルールは、最初は慣れないが、実は理に適った配置です。
僕は、Go言語以外の全てのプロジェクトリポジトリも $GOPATH/src
配下に配置するようにしています。そこで役立つのが ghq
です。
ghq
は go get
と同様のルールでソースコードリポジトリを取得するためのツールです。homebrewでインストールできます。
% brew install ghq
インストールが終わったら、 ghq
でソースを取得してくるディレクトリを以下のように指定します。
% git config --global ghq.root '~/dev/src'
これで準備は完了です。ここで ghq list
と打つとリポジトリ一覧を取得してくれます。また、ghq get <target>
とすることで、リモートリポジトリのソースコードを取得できます。
# 例
% ghq get git://hogehoge.git
% ghq get https://github.com/mackerelio/mackerel-agent
% ghq get mackerelio/mkr
これで、手元のソースコードリポジトリの管理を簡単におこなうことができるようになりました。
ghq
についても作者のエントリを参照してみてください。 → ghq: リモートリポジトリのローカルクローンをシンプルに管理する (ちなみに、リンク先で言及されている ghq import
は現在は削除されています)
peco
でより便利にリポジトリの移動を行う
さて、これで統一感の取れたリポジトリ管理ができるようになりましたが、$GOPATH/src
配下の階層が非常に深くなってしまい、そのままだと移動が面倒です。そこで peco を使います。
peco
はターミナル上で標準入力を行ベースでインクリメンタルにフィルタするUIを提供する、汎用性の高いツールです。これもまたhomebrewでインストールが可能です。
% brew install peco
peco
がインストールされたら、早速 ghq
と組み合わせて使ってみましょう。お使いのシェルがzshの場合、以下の様な設定を、.zshrc などに書いてみてください。
bindkey '^F' peco-src
function peco-src () {
local selected_dir=$(ghq list | peco --query "$LBUFFER") if [ -n "$selected_dir" ]; then
selected_dir="$GOPATH/src/$selected_dir"
BUFFER="cd ${selected_dir}"
zle accept-line
fi
zle clear-screen
}
zle -N peco-src
peco-src
という関数を定義し、それを Ctrl+fで呼び出せるようにしてあります。
この設定を読み込んだ後に、ターミナル上で、Ctrl+fを入力するとpecoのUIが現れます。そこで適当にキー入力をおこなうと、フィルタリングされていく様子が見て取れるでしょう。
例えば、私の環境で、 github mackerel- という条件でフィルタしている様子が以下になります。
ここで、適当なリポジトリを選択し、エンターを押して確定すると、そのディレクトリに移動することができます。
これで、go get
やghq get
したリポジトリに自由に移動できるようになりました。
peco
のその他の活用例は、公式のWikiのSample-Usage を見ると良いでしょう。
まとめ
これで、Goで開発をおこなう下準備は整いました。エディタ設定や、実際にプロジェクトを開始するときにどうするかなどは、そのうち書くかもしれません。