CLOVER🍀

That was when it all began.

IntelliJでfsc、sbtを使う

Scalaでコードを書く時は、最近は滅法Emacs+sbtなことが多いのですが統合開発環境を使う時はEclipseよりもIntelliJを使うことの方が多いので、IntelliJを使った場合のfscおよびsbtを使う手順を載せておきます。…自分のメモとして。

まあ、このところは仕事の都合でEclipseを強制されているのがちょっと残念なのですが。

まずは、プラグインのインストール。メニューの「File」→「Settings」を選んで、IntelliJの設定画面を起動。その中から「Plugins」をクリックし、プラグイン一覧の表示が終わった辺りで「Available」タブを選び、Scalaとsbtのプラグインをそれぞれインストールします。キーワード「scala」で探すと、すぐに見つかると思います。

あとは、右クリックして「Download and Install」。インストールが終わると、IntelliJの再起動を促されるのでそれに従って再起動。

Scalaのコードスタイルの設定とかは、お好みで。

まずは、普通にプロジェクトを作成します。プロジェクトが使うScalaを指定してくださいね。

※なお、この時「Create compiler library」と「Create standard library」の項目「Level」に、globalを指定すべきかproject-levelを指定すべきかはイマイチハッキリしません…
 無駄にGlobal Libraryが増えてしまうことが多いので、project-levelを指定することの方が多いのですが

fsc

IntelliJfscを使う方法は、どうも2段階あるようなのですが、後者の方はなんか高速化を感じなかったですね…。一応、両方紹介しておきます。

「Settings」からfscを起動する

プロジェクトの設定として、fscを利用する方法です。メニューの「File」→「Settings」から設定画面を起動します。続いて、「Compiler」→「Scala Compiler」を選択。
そして、「Use fsc(fast scalac)」にチェックを入れます。これで終了です。

初回はライブラリを全て読みにいくので遅いですが、2回目以降は高速に動作するようになります。

プロセスとして、明示的にfscを起動する

続いて、実行設定を変更してfscを明示的にプロセス起動する方法です。メニューの「Run」→「Edit Configurations」を選択し、実行設定を起動します。
ここで「Defaults」を選び、+ボタンを押します。

すると、左に「Add New Configuration」が展開されるので、この中から「Scala Compilation Server」を選びます。

追加された「Scala Compilation Server」の設定に、適当に名前を付け(ここではfscとしています)、「Before launch」の「Make」からチェックを外してOKボタンを押下。

最後に、fscを明示的に起動します。

fscが起動したら、起動対象を通常のScalaクラスなどに戻しておきます。これを忘れてRunすると、いっぱいfscが起動しますよ…。

で、これの効果なのですが、どうも??といった感じです。他のサイトでは「Settings」で設定したfscとセットで利用するといった感じで書かれていますが、そもそも「Settings」でfscを使うことにしてOKを押した段階で、プロセスを見るとfsc起動してますしね。

前者だけでよいのかも。

sbt編

IntelliJのsbtプラグインをインストールして、簡単な設定をしたらすぐに使えるようになります。

まずは、メニューの「File」→「Settings」を選択して、設定画面を起動。続いて「SBT」を選び、「IDE Settings」の欄の「SBT launcher JAR file」にローカルにダウンロードしているsbtのJARファイルへのパスを、「VM parameters」にはsbt-launch.jarを起動するJavaVMへのパラメータを設定します。

sbtプラグインがインストールされた状態でプロジェクトを開くと、下の方に「SBT Console」が表示されていると思うので、これを開き緑色の再生ボタンを押すとsbtが起動します。

この状態でもcompileとかrunコマンドは利用できるのですが、sbtを使うと実はIntelliJで設定したScalaのバージョンとかは見てくれません。よって、build.sbtを作成します。作成したら、SBT Consoleでreloadしましょう。

これで一応ちゃんと設定できました。

が、この状態でRunすると、sbtはスルーされてしまい通常のscalacが走ってしまいます。

実行時にsbt経由でRunするよう、変更してみましょう。起動対象のクラスの「Run/Debug Configurations」を開き、「Before launch」の部分の「Make」のチェックを外し「Run SBT Action」にチェックを入れます。

「Run SBT Action …」の箇所は、「compile」あたりを設定しておきましょう。

これで、次回からRun時にはsbt compileが走った後に起動するようになります。sbtを使ったコンパイルScalaコンパイルとしては爆速なので、これはこれで快適なのですけどまだ問題が。

このままだと、普通にRunするとsbtが出力するクラスファイルの配置先とIntelliJが期待するクラスファイルの場所がズレているので合わせてあげる必要があります。でないと、Runコンソールに出力される結果がおかしい…というか、古い内容が出力されることになります。裏のSBT Consoleでは、きちんとコンパイルされているのにね。

というわけで、「Project Structure」の「Modules」を選び、「Paths」の「Use module compile output path」をsbtが出力するパスに合わせてあげましょう。

これで、ちゃんと動くようになりましたよっと。