kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

sbt + sbt-idea + Intellij Scala Pluginを使ったScala開発 (in Mac OS X)

注意:この記事の内容は、2013年7月2日現在、やや古くなっています。現在は「Use external build」のチェックはONにしたままで、「Use project FSC」をチェックしない方が安定して動作します。これは、最近のアップデート(ここ1〜2ヶ月くらいの話ですが)「Use external build」を使ったときに、IDEAが内部でzincというsbtベースのスタンドアロンコンパイラを内部で使うようになった事に起因しています。コンパイラの設定以外は現在でもそのまま通用しますが、このエントリを読んでIntelliJ IDEA + ScalaプラグインによるScala開発を行おうとしている人は注意してください。

これは、Scala入門をIntelliJ IDEAでやろうとしている人向けのエントリではありません。このエントリでは、IntelliJ IDEAのScalaプラグインのインストールやその他プラグインのインストールについては触れていません。また、設定上の注意事項(特にPlay 2と併用する場合)などは飛ばしているので、ご注意ください。

少しは役に立つ記事を書いてみようかと思い、ちょっと普段Scala + sbt + IntelliJ IDEA + Scala Pluginでどいういう風に開発してるのか書いてみることにしました。面倒なので、sbtの設定ファイルについての解説は飛ばします。テンプレートとなるプロジェクトを作成したのでこれをforkするなりcloneするなりして弄ってみてください。

さて、とりあえず上記のscala-idea-templateプロジェクトをcloneしてきて、sbtがインストールされているとします。コンソールからsbtコマンドをたたくと次のように表示されます。

 ~/git/scala-idea-template (git master) 
[mizushima]$ sbt
[info] Loading global plugins from /Users/mizushima/.sbt/plugins
[info] Loading project definition from /Users/mizushima/git/scala-idea-template/project
[info] Updating {file:/Users/mizushima/git/scala-idea-template/project/}default-2c9cb0...
[info] Resolving org.scala-sbt#precompiled-2_10_0-m7;0.12.1 ...
[info] Done updating.
[info] Set current project to sbt-idea-template (in build file:/Users/mizushima/git/scala-idea-template/)
> 

さて、ここで

[info] Loading global plugins from /Users/mizushima/.sbt/plugins

というメッセージはとりあえず無視してください(こちらの開発環境での設定によるものです)。ここで、既にsbtのプラグイン設定ファイル(project/plugins.sbt)にIntelliJ IDEA Scalaプラグイン用のプロジェクト設定ファイルを生成するためのsbt-ideaプラグインが入っているので、これを実行します。

> gen-idea
[info] Trying to create an Idea module sbt-idea-template
[info] Updating {file:/Users/mizushima/git/scala-idea-template/}default-986503...
[info] Resolving org.specs2#specs2-scalaz-core_2.9.2;6.0.1 ...
[info] downloading http://repo1.maven.org/maven2/org/specs2/specs2_2.9.2/1.12.2/specs2_2.9.2-1.12.2.jar ...
[info] 	[SUCCESSFUL ] org.specs2#specs2_2.9.2;1.12.2!specs2_2.9.2.jar (6901ms)
[info] Done updating.
[info] Resolving org.specs2#specs2-scalaz-core_2.9.2;6.0.1 ...
[info] downloading http://repo1.maven.org/maven2/org/specs2/specs2_2.9.2/1.12.2/specs2_2.9.2-1.12.2-sources.jar ...
[info] 	[SUCCESSFUL ] org.specs2#specs2_2.9.2;1.12.2!specs2_2.9.2.jar(src) (1718ms)
[info] downloading http://repo1.maven.org/maven2/org/specs2/specs2_2.9.2/1.12.2/specs2_2.9.2-1.12.2-javadoc.jar ...
[info] 	[SUCCESSFUL ] org.specs2#specs2_2.9.2;1.12.2!specs2_2.9.2.jar(doc) (3803ms)
[info] Excluding folder target
[info] Created /Users/mizushima/git/scala-idea-template/.idea/IdeaProject.iml
[info] Created /Users/mizushima/git/scala-idea-template/.idea
[info] Excluding folder /Users/mizushima/git/scala-idea-template/target
[info] Created /Users/mizushima/git/scala-idea-template/.idea_modules/sbt-idea-template.iml
[info] Created /Users/mizushima/git/scala-idea-template/.idea_modules/sbt-idea-template-build.iml
> 

こんな感じのメッセージが表示されるはずです。ちなみに、build.sbtで依存関係に指定したscalaj-httpがダウンロードされていませんが、これは既に他のプロジェクトで同じライブラリの同バージョンのものがダウンロードされてキャッシュされているからです。

さて、ここまででIntelliJ IDEAの設定ファイルは生成できたので、IntelliJ IDEAを起動します。

http://gyazo.com/1dab70c5fc4277b8a7c9a4f1e88707b5.png

こんな感じの画面が表示されるので、「Open Project」を選択して、scala-idea-templateのあるディレクトリを指定して、「Choose」を押します(以下)。

http://gyazo.com/60b679810a2a2232cea90d1b9684b5bf.png

ちょっと待つと、以下のような画面が表示されます。

http://gyazo.com/429d5ef17c9f2e3b59714c8b90f3db83.png

これで準備完了…の前に、もう一ステップ必要です。src/main/scalaがScalaソースのルートディレクトリに設定されているので、そのためのディレクトリを作ります。

http://gyazo.com/0ea529a245b5393121566fd624fb711d.png

これで今度こそ準備完了です。とりあえず、パッケージを作ってみましょう。面倒なので、toolsパッケージにします。

http://gyazo.com/5d854395703e7cc329a4df751259e556.png

toolsパッケージの上にHello objectを作成します。

http://gyazo.com/e8bc878f92e511ca6dce4e0e059eb95f.png

あとは適当にプログラムを書いていきましょう。IntelliJ IDEA の Scala プラグインは import補完も含めてちゃんとサポートしています。例えば、java.util.Calendarが使いたくなったとします。以下のようにCalendarまで入力して、Alt + Enter。

http://gyazo.com/cf5fd84124bc35b66184d5a985399717.png

すると、以下のような感じで、java.util.Calendarを自動的にimportしてくれます。

http://gyazo.com/85c22014f9923abf6d45f594b47d05b1.png

val calendarの型が知りたい場合、calendarにカーソルを合わせたときに出てくる電球マークの「Add type annotation to value definition」を選択すると、以下のようにcalendarの型としてCalendarが明示的に付きます。型推論の結果がよくわからないときに便利です。

http://gyazo.com/5fffcf1ff30fd0e912e0d097e9b98cbf.png

さて、プロジェクトをビルド…する前にちょっと注意点をば。現在の最新版のIntelliJ IDEA + Scala Pluginでは、以下の「Use external build」のチェックボックスをまず外す必要があります。

http://gyazo.com/aea80f6643e97e9d123038981531c6fa.png

プロジェクトの設定画面が次のようになっていることを確認し、「Use project FSC」にチェックを入れます。さて、ビルドしてみましょう。ビルドは、「Build」メニューの「Build Project」を使います(私は、Command + Bでビルドできるようにしてあります)。

http://gyazo.com/6e4b55d7cd4f20d79e7a22656a318900.png

Scalaはコンパイルが遅い言語の一つですが、IntelliJ IDEA + Scala Pluginを使った場合、差分ビルドではsbtでビルドするよりも高速にビルドできます(厳密に測定していませんが、差分ビルドでは明らかに早い)。

IntelliJ IDEA (+Scala Plugin)は、他のIDEに慣れていると若干操作性に癖を感じるかもしれませんが、

  • リファクタリングサポート(特にRename)
  • 自動インポート
  • メソッド/変数の(定義元/呼び出し元)へのジャンプ
  • sbt-ideaによって、依存ライブラリのソースコードがダウンロードされる

など、現代的なIDEに必要な機能はあり、現時点でのScala開発環境としては最も良く出来たものの一つだと思います。もちろん、Eclipse JDTや、IntelliJ IDEA (Java)における補完機能には及ばない部分もありますが、リファクタリングサポートや自動インポート、依存ライブラリのソースへのジャンプなどの機能があるだけで結構効率が違うと感じます。

さて、テストの話も書いてみようかと思ったのですが、そろそろ眠くなって来たので、今日はこれまで。