GoglandでオススメのGo快適開発環境構築方法

Goに2ヶ月ほど前に入門しました。

普段はVimをメインエディタとして使っているのですが、リファクタリング・デバッグ・コードジャンプ・補完などの機能がビルトインされたGoglandを使ってみたら思いのほか使用感が良く、あっという間に気に入ってしまったので、これからGoで開発を始めようかなと思ってらっしゃる方に是非Goglandでの開発をオススメしたいので私なりの設定方法やノウハウなどを投稿します。

### 環境

MacBook Pro (Retina, 13-inch, Early 2013)
macOS Sierra Version 10.12.5


## 準備

Goglandのダウンロードサイトはこちらです。

[Gogland Early Access Program](https://www.jetbrains.com/go/download/)

Goglandは現在`Early Access Program`です。
現在は無料で提供されていますが、いずれ有料になると思います。
JetBrainsさんの他のツールは約800円/月ぐらいなので、Goglandもおそらくそれぐらいの金額になるのではないでしょうか。
PyCharmのCommunity Editionのように、無料で提供してもらえる方法も選択肢として用意して頂ければ有難いですが。
ただ、お金を払っても使う価値は充分にあると思っています。

私の現在のGoglandのバージョンは1.0です。(2017/09/10現在)


## GoglandでのGOROOT, GOPATHの扱い方について

Goは`GOROOT`と`GOPATH`という環境変数があり、これらを設定しなければいけませんが、Goglandではプロジェクトごとにそれらを設定出来るので便利です。

**GOROOT** --- Goディレクトリ(実行バイナリが含まれた)のルート
**GOPATH** --- Goで開発する際のワーキングディレクトリのパス

また下記はGoglandのセットアップについてのドキュメントですが、`It's recommended to keep all Go code in single a workspace with the following layout:`と言っているように、１つのworkspaceにすべてのGoコードを置いたほうがいい、と言っています。

[Getting Started with Gogland](https://www.jetbrains.com/help/go/getting-started-with-gogland.html)

しかし、たとえばプロジェクト毎にGoのバージョンを変えたい、パッケージの依存問題などをあらかじめヘッジしておきたい、などの理由で厳密にプロジェクト毎にGOROOTやGOPATHを指定したい場合があるかと思います。
そういった場合でも、Goglandではまったくストレスを感じません。

例えば下記のように`project-1` `project-2`という2つのプロジェクトがある時、`project-1`では`project-1-path`を`GOPATH`に設定し、`project-2`では`project-2-path`を`GOPATH`に設定すると、お互いのパッケージを共有で使用しないため、それぞれのプロジェクトがお互いに干渉しあうことなく開発できます。

```
.
├── project-1-path
│   └── src
│       └── project-1
│           └── main.go
└── project-2-path
    └── src
        └── project-2
            └── main.go
```

この辺りはどういう風に開発したいか、ということだと思いますので一概にどちらが良いとは言えないかもしれません。
ですが、Goglandでスマートに切り替えが出来るなら、こういったディレクトリの切り方も有りではないかと思っています。
`go_1.7.5`、`go_1.8.3`というように、Goのバージョン単位でworkspaceを作るのもいいかもしれませんね。

## プロジェクトを始める

実際に`project-1`を読み込んでみます。
(下記`project-1`の構造が出来ている、という前提です)

```
└── project-1-path
    └── src
        └── project-1
            └── main.go
```


`Open Project`を選択

<img width="463" alt="start.png" src="https://qiita-image-store.s3.amazonaws.com/0/32962/c0974102-cc54-029b-0ad2-6e434dd1598f.png">

<br />

`project-1`を選択して実行

<img width="495" alt="project-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/32962/8099435e-fe6c-7c99-ee05-77ad69451db6.png">

これで`project-1`を開発する準備が出来ました。

## テーマを設定する

個人的な好みですが、私はなんでもなるべく黒っぽい画面で開発したいです。
そのほうが何となくエンジニアっぽいからです(笑)。

左上の`Gogland-EAP` -> `Preference` -> `Appearance & Behavior` -> `Appearance`

上部の`Them`の`Default`を`Darcula`にします。

<img width="974" alt="thema.png" src="https://qiita-image-store.s3.amazonaws.com/0/32962/4c0c0859-e67b-bc4f-71a4-b11692b091d4.png">


## プロジェクト固有のGOPATH、GOROOT設定

### GOROOT

先ほど言ったように、これが簡単に出来るのがGoglandの魅力の１つだと思ったところです。

`Gogland-EAP` -> `Preference` -> `Go` -> `GOROOT`

Goがインストールされていればセレクトボックスから自動で選択出来るようになっていると思います。

<img width="773" alt="goroot.png" src="https://qiita-image-store.s3.amazonaws.com/0/32962/3b3f2b73-231e-9b60-afc6-e463d491adce.png">

### GOPATH

`Gogland-EAP` -> `Preference` -> `Go` -> `GOPATH`

`Use GOPATH that's defined in system environment`のチェックを外し、`+`ボタンを押して先ほどのルートのディレクトリ`project-1-path`を選択します。

```
└── project-1-path
    └── src
        └── project-1
            └── main.go
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/6ab9eb16-5617-e1d0-7867-623a930cc026.png)

これで、project-1だけのGOROOT、GOPATHが設定出来ました。

## プラグインを整理してシンプルにする

私は出来るだけシンプルに使いたかったので、最初から用意されているプラグインをあまり使わないように設定しました。
画面がごちゃごちゃするよりもシンプルにすっきり使えたほうが個人的に好きなのでそうしています。
`GitHub`や`Database`、`REST Client`、`Terminal`などは他のもので代用出来るのでわざわざGoglandのプラグインでやる必要も無いと思っているし、多分プラグインだと結局機能が足りなくて専用のものを使うことになるだろうと思うからです。
よって、割り切ってこれらはばっさり使わないように設定しておくとスッキリするかと思います。

`Gogland-EAP` -> `Preference` -> `Plugins`

私の場合、今は`Go`と`Go IDE`以外を全部外しています。

### IdeaVIM、TypoScript Plugin

といってもPlugin全体を否定するわけではないので、自分にとって必要なものはインストールしました。
私にとっては上記2つは必要だと思ったのでインストールしました。

Pluginsの画面から、`Browse repositories...`をクリックし、上記を検索してインストールします。
Typoチェッカーは他にもありましたが、★の多さで`TypoScript Plugins`にしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/2a57e688-29b5-a98d-83a3-c62c4ccdea40.png)

<br />

私の場合、`View`の`Toolbar`や`Status bar`などのチェックも外して下記のようなエディタだけの画面にしています。
`Toolbar`などを使って何か操作することは普段はあまり無いですし、私は画面いっぱいにエディタを表示したいので最終的にこのようなシンプルな画面にしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/a2d4bec7-e4e9-f7d3-b52b-43a0ea70c1c3.png)

## キーバインド

あまりたくさんキーバインドを覚えるのは大変なので、よく使うものだけ覚えるようにしました。
あと、少しカスタムもしました。
「ファイル検索」「右のタブへ移動」「左のタブへ移動」がカスタムです。

| キーバインド | 動作 |
| --- | --- |
| command + 1 | プロジェクトツリー開閉 |
| command + 4 | Runウィンドウ開閉 |
| command + 5 | デバッグウィンドウ開閉 |
| command + f | ファイル検索 |
| command + → | 右のタブへ移動 |
| command + ← | 左のタブへ移動 |

<br />

「ファイル検索」のキーマップ設定は、 `Gogland-EAP` -> `Preference` -> `Keymap` -> `Main menu` -> `Navigate` -> `File` です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/6e2bca7b-e1f1-deaf-e07e-f2ccf548828b.png)


`dommand + f`ですぐにファイルサーチが出来るようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/e150a23b-913d-1bb7-5bbb-b896a2570511.png)

<br />

「右のタブへ移動」「左のタブへ移動」は、 よく使っている`iTerm`のタブ動作と同じにしました。
`Keymap`設定画面の右上の検索で`tab`を入力して検索すると、`Select Next Tab`と`Select Previous Tab`という項目が引っかかるので、設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/a73f2f3d-0e3b-65b1-5df5-9745ce34f2f9.png)

## Runコンフィギュレーション

次は実際にGoアプリケーションを動かすところです。

`main.go`を準備します。

```
package main

import (
	"log"
)

func main() {
	str := "Hoge"
	log.Println(str)
}
```

`Run` -> `Edit Configurations` でRun設定画面を開き、左上の`+`ボタンを押して`Go Application`を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/a46603b5-7fcc-383e-69be-f05757b20c6d.png)


`Name`を適当に設定し、`Run kind`をpackageにし、pathやdirectoryを設定して`Apply`を押してOKします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/02f3314a-ee31-8326-cfab-7f2dbe381503.png)

あとは`Run`から先ほど名前を付けた`Run 'run'`を選択し、実行します。
Runウィンドウが開いて実行されました。
Runウィンドウは`command + 4`で開閉出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/ff7701ab-8057-f0c9-8a61-822ee3533f20.png)

## デバッグ

合わせてデバッグも試します。
ブレイクポイントを仕込みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/7e0e3822-50dc-c565-7f13-78622e71a29b.png)

この状態で`Run`から`Debug 'run'`を選択し、実行します。

ブレイクポイントを仕込んだ場所で、実行がストップしていることが確認出来ると思います。
`str`の中身も確認出来ています。
デバッグウィンドウは`command + 5`で開閉出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/f68932f1-871c-3740-2f12-ce90f7059a97.png)

<br />

デバッグのコンソールを見ると分かるのですが、Goglandに`dlv`が含まれていて、`dlv`でデバッグしています。

```
GOROOT=/usr/local/Cellar/go/1.8.3/libexec
GOPATH=/Users/maedamasaki/go/project-1-path
/usr/local/Cellar/go/1.8.3/libexec/bin/go build -i -o /private/var/folders/h8/1hkjksjn6hn72q1x4ym362dr0000gn/T/rungo -gcflags "-N -l" project-1
"/Users/maedamasaki/Library/Application Support/Gogland1.0/intellij-go/lib/dlv/mac/dlv" --listen=localhost:63412 --headless=true --api-version=2 --backend=default exec /private/var/folders/h8/1hkjksjn6hn72q1x4ym362dr0000gn/T/rungo --
API server listening at: 127.0.0.1:63412
2017/09/09 20:46:11 Hoge

Process finished with exit code 0
```

<br />

ちなみにテストについても同様にRunとDebugが可能です。
`Run` -> `Edit Configurations`で`+`ボタンを押した時に`Go Test`を選択してテストのコンフィグレーションを作成すると、`Run`からテストが実行出来るようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/e19a2c48-a12b-fecc-1dae-d9b12f1e2468.png)


## 外部パッケージインストール

残念ながら、GoglandにはPyCharmのように外部パッケージをインストールする機能は現時点では無いようです。

しょうがないので私はコマンドラインから実行してインストールしています。
今後、Goglandに外部パッケージ管理機能が追加されるかもしれませんが、現在のところは無さそうです。

試しにORMの`gorm`をインストールしてみます。

`main.go`に`"github.com/jinzhu/gorm"`のimportを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/b59b6011-6b24-c6a2-8913-f6779deecfac.png)

`project-1`の直下で`go get -t -d -v ./...`でインストールするのですが、その際にプロジェクトで指定したGOROOTとGOPATHを指定してインストールします。

```
$ GOROOT=/usr/local/Cellar/go/1.8.3/libexec \
  GOPATH=/Users/maedamasaki/go/project-1-path \
  go get -t -d -v ./...
```

インストール出来たら`main.go`で確認してみます。
(外部パッケージのGoglandでの読込には多少時間がかかる場合があります)

ちゃんと補完が効いていて、Goglandで認識出来ていることが確認出来ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32962/2c5ccea4-ac6b-e6df-c5ee-0c9c322b3951.png)

glideなどで管理している場合のパッケージ管理も同様です。

******

いかがでしたでしょうか。
私がGoを気に入っている点はとにかく早いことですが、Goglandの動きも非常に軽快なのでGoの開発にマッチしていると思います。
本記事がこれからGoをGoglandで開発される方の一助になれば幸いです。