おそらくはそれさえも平凡な日々

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 です。

ghqgo get と同様のルールでソースコードリポジトリを取得するためのツールです。homebrewでインストールできます。

% brew install ghq

インストールが終わったら、 ghq でソースを取得してくるディレクトリを以下のように指定します。

% git config --global ghq.root '~/dev/src'

これで準備は完了です。ここで ghq list と打つとリポジトリ一覧を取得してくれます。また、ghq get <target> とすることで、リモートリポジトリのソースコードを取得できます。

はかなり柔軟に指定ができて賢い振る舞いをします。例えば、以下のように、各種URLやGitHubのパスなどを指定しても、柔軟に解釈して、ダウンロードしてくれます。

# 例
% 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 getghq getしたリポジトリに自由に移動できるようになりました。

peco のその他の活用例は、公式のWikiのSample-Usage を見ると良いでしょう。

まとめ

これで、Goで開発をおこなう下準備は整いました。エディタ設定や、実際にプロジェクトを開始するときにどうするかなどは、そのうち書くかもしれません。

created at
last modified at

2019-06-01T18:57:39+0900

comments powered by Disqus