前回はGo言語のベースとなる開発環境をプロジェクトごとの管理を意識して作ってみました。
今回は実際にコーディングを進めていく上で使うツールとなるIDEの導入を行いたいと思います。今回選んだのはIntelliJ IDEAです。
これはJetBrains社の製品で、PhpStormやAppCodeをずっと使っており使い勝手が慣れているのと信頼性が高いことから選びました。
目次
IntelliJ IDEAをインストールする
公式サイトからCommunity Editionをダウンロードするか、Ultimateの人はHomebrew Caskでも入れられます。
$ brew cask install intellij-idea
なお、Ultimateは有料で30日間のトライアル付きです($499/年)。
Goプラグインをインストールする
IntelliJ IDEAをインストールしたら、早速起動してプラグインを入れます。
Preferences... > Plugins > Browse repositories... と選び、上の検索窓に go と入れると上から2番目くらいにGoプラグインが出てくるので、選択して右側のInstallボタンを押します。
インストールが完了するとインストールボタンが再起動ボタンに変わるので、押してIntelliJを再起動します。
Goプロジェクトの作成
では、次にGoプロジェクトを作成してみます。
File > New > Project... とメニューから選択します。
出てきたダイアログの左のサイドバーからGoを選択し、Nextを押します。
次にProject SDKの指定画面が出ますが、これは初期状態だと空になっているかもしれませんので、右のConfigure...ボタンを押して、もしHomebrewから入れていれば、 /usr/local/Cellar/go/1.5.3/libexecとか(環境によって違います)を設定します。
最後にプロジェクトの場所などを設定しますが、これは
GOPATH/src/packagename
のようになっている必要があります。
あらかじめ、GOPATHにしたい場所で前回説明したdirenvなどの設定を行い、src/[packagename]のディレクトリを作成してから選びましょう。
プロジェクトを開くとまだ何もない状態だと思いますが、ここへmain.goとかglide.yamlなどを作っていきます。
ライブラリの参照設定
今回一番苦労したのがここです...。
デフォルトの設定だと、IntelliJのGoプラグインはGOPATH内しか参照してくれません。
そこで、ライブラリの設定を行います。
Preferences > Languages & Frameworks > Go > Go Libraries と選んで、Project Librariesに現在開いているパスの一つ上の階層を追加します。
つまり、さっきの例だと
GOPATH/src
となります。
vendorに対応する
現在、このプラグインはGO15VENDOREXPERIMENTに対応できていないので、先ほどの設定をしてもvendor内を見てくれません。
しかも、さっきの作業と同じようにProject Librariesに追加したらでるんだろ?と思い、やってみましたが、なぜか出ません!!
これの対策は、ちょっと汚いのですが以下のようにターミナルで操作します。
※あらかじめ、glide upなどしてvendorが存在している前提です
$ cd GOPATH/src $ mkdir -p .vendor/packagename $ cd packagename $ ln -s $(pwd)/vendor ../.vendor/packagename/src
こうすると、
src ├── .vendor │ └── packagename │ └── src (これが元のvendorのシンボリックリンク) │ └── github.com.... ├── packagename │ ├── glide.lock │ ├── glide.yaml │ ├── main.go │ └── vendor │ ├── github.com │ │ ├── ....etc
こういう構造になります。
そして、先ほどのProject Librariesで GOPATH/src/.vendor/packagename を追加すると...
うまく認識できるようになりました!
どうやら、srcというディレクトリ名じゃないと読み込んでくれないようです。
参考)https://github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/1820
さらに快適に作業できるよう、IntelliJのプロジェクトツリーからvendorディレクトリを選んで右クリック、Mark Directory As > Excluded としておきましょう。
これで、プロジェクトツリー上には表示されなくなります。これは表示されてた方がいいという人もいるのかもしれないですが、ここに出ていると、コーディング中のアシストで自動インポートさせるときに、例えば"github.com/Sirupsen/logrus"と"packagename/vendor/github.com/Sirupsen/logrus"と二つの候補が出てきてしまって邪魔なのです(もう一つ、後述する重要な理由があります)。
シンボリックリンクを入れるディレクトリを上の階層に作ったのも同じ理由でプロジェクトツリーに出したくなかったからです。ちなみにこれを同じ階層において、同じようにExcludedするとそもそもパッケージ自体が参照されなくなってしまいますw
【追記】vendor以下に追加したファイルについて
この状態で、IntelliJを起動したまま glide get とか glide up してvendor内にファイルが増えた時に、なぜか自動的に読んでくれません。。
こういう時は、IntelliJを再起動してみるとうまく読んでくれます。ちょっと面倒なのですが・・・、今のところ他に対策が見つかっていません。。
goimportsを使う
Go言語の特徴として、使っていないimport文があるとエラーになるという点があります。
コードを修正していてimportを消し忘れてしまう、ということは結構あるのではないでしょうか。
そんな時、goimportsというコマンドを使うと自動で未使用のimport文を消してくれます。
以下のコマンドでインストールできます(direnvしているディレクトリ外で実行します)。
$ go get golang.org/x/tools/cmd/goimports $ which goimports /Users/abe/go/bin/goimports
上記whichの結果をメモしておきます。
Goファイル保存時に自動的にgoimportする
IntelliJにはFile Watcherといってファイルの変更を監視して特定の処理を自動的に行う機能があります。
これを使って、自動的にgoimportしてみましょう。
Preferences > Tools > File Watchersと選び、下の+ボタンを押すと以下のような画面が出るので、この画面と同じように入力します。
このうち、Programのところは先ほどのwhichの内容を入れます。
Immediate file synchronizationは必ずオフにしてください。そうしないと、入力中に毎回goimportsが実行されてキャレット位置がずれて最悪なことになりますw
これで、Command+Sとかで明示的に保存したり、フォーカスが別のアプリに移動したりした時に自動的にgoimportsが走ります。
この機能を使う注意として、先ほどのvendorをExcludedしていないと、glide upとかした時に追加された外部パッケージにも走ってしまい、予期しない不具合が生じてしまうことがあります(実際、ビルドエラーになってハマりました)。
なので、使用する場合はvendorをExcludedしていた方が良さそうです。
参考サイト
GoFmt or GoImports on save in IntelliJ