Locked History Actions

sbt/IntelliJ

IntelliJ IDEAでの利用

準備

ここではIntelliJ IDEAにSBTプラグインを入れてIntelliJで編集しつつSBTでビルドすることにする。。。のだが、まずは普通のscalaソースを作成して実行できるようになるまでを見ていく。

事前にIntelliJ IDEAに示したように、Scalaプラグイン、SBTプラグインが導入されているものとする。これ以降すべてをIntelliJ IDEA上で行うので、DOS窓やシェルは使用しない。

プロジェクトの作成と最小限の設定

IntelliJ IDEAでは一つのプロジェクト中に複数のモジュールを作成することができるのだが(Eclipseで言えば一つのワークスペース中に複数のプロジェクト)、一つのプロジェクトについて一つのモジュールという形式もある。SBTプラグインを使用する場合は、後者の形式でないとうまくいかないようだ。以下のようにする。

  • File/New Projectメニューを選択
  • Create Project From Scratchを選択。次へ
  • トップのNameにプロジェクト名を入力する。他の部分をいじらなければ、その名前のプロジェクトが作成され、同じ名前のモジュールが作成される。モジュールのタイプは「Java Module」にしておく。次へ
  • Do not create source directoryを選択する。ソースディレクトリはSBTの形式にするので、通常のソースディレクトリは作成しない。次へ
  • Scalaを選択する。終了する

新しいプロジェクトには.ideaというディレクトリのみが存在し、その中になにやら設定ファイルがある。次に、sbtプラグインを使用してsbtのプロジェクトとして作成する。

  • 左下の「SBT Console」をクリックし、緑のボタンをクリックする。
  • プロジェクトを作成するかと聞かれるので「y」。
  • プロジェクト名、組織名を適当に入力する。sbt側はIntelliJ側のプロジェクト名のことなど知らないので、入力を求められる。
  • このプロジェクトのバージョン、使用するScalaのバージョン、SBT自体のバージョンを入力する。
  • 初めてSBTを起動する場合や、以前とは異なるScalaのバージョンを指定すると必要なライブラリがダウンロードされる(※)。
  • IntelliJ IDEAの表示を見るとlib,project,src,targetというディレクトリが作成されたことがわかる。
  • SBT Consoleは「>」というプロンプトを出し、コマンド受付状態であることを示す。そのまま何らかのコマンドを入力してもよいし、exitして抜けてもよい。抜けた場合はもう一度緑のボタンを押してコマンドモードに入る。この場合、プロジェクトは作成済みなので、もう一度作成されることはない。

通常のIntelliJプロジェクトではsrc直下にscalaのソースを格納するが、SBTの場合はsrc/main/scalaになる。IntelliJ側はこのことを知らないので、ここにソースを格納することを教えてやる。

  • File/Project Structureメニューを選択する。
  • 左側でModulesを選択し、Sourcesタブを選択。
  • 右側のディレクトリツリーでソースディレクトリを選択するのだが、このやり方は少々変わっている。src/main/scalaをクリックした状態で、上にある水色の「Sources」ボタンを押す。すると、ディレクトリツリー上のscalaが水色になると同時に、左側の「Source Folders」にもそれが現れる。

必要ライブラリのダウンロード

上に示した※の時点で必要ライブラリがダウンロードされることがある。 これは、SBTにビルトインされたivyによってMaven2リポジトリから取得されるようで、リポジトリが混んでいる場合には非常に時間のかかることがある (ほとんどハングアップしているように見える)。

事態が進行中かどうか見極めるには、~/.ivy2以下にあるファイルの状態を確認するとよい。 ダウンロード中のファイルは「.part」という拡張子になっており、ダウンロードが進行しているならば、このファイルのサイズが増加していくことが観察できる。

HelloWorldの作成と実行

HelloWorldを作成して実行できるまでを確認する。

  • 先のソースフォルダ「src/main/scala」を右クリックしてNew/Scala classを選択。適当にScalaソースファイルを作成する

object Sample {
 def main(args: Array[String]) {
  println("hello, world")
 }
}
  • Run/Edit Configurationsメニューを選択する。
  • 左上の「+」アイコンをクリックし、Applicationを選択する(Scalaなんちゃらという選択肢もあるが、この場合は無関係)※。
  • 一番上のNameとMain classを指定する。上の例の場合は共にSampleでよい。OKをクリックする。
  • ツールバーに緑の矢印が表示されるので、その左側が「Sample」であることを確認して、緑矢印を押す。

※Run/Edit ConfigurationsメニューのDefaultsは、あくまでも各コンフィギュレーションのデフォルト値を指定するものなので、Defaults上で設定を行っても新しいコンフィギュレーションは作成されない。

この状態でソースを編集して、緑矢印をクリックすれば、変更されたソースが自動的にコンパイルされて実行される。しかし、特にscalaソースのコンパイルは非常に遅い。

SBTの利用

コンパイルを速くする

デフォルトではIntelliJの機能を使用してコンパイルされるため、これが非常に遅い。SBTの機能を利用することにより、コンパイルを高速化することができる。

  • Run/Edit Conigurationsメニューを選択し、先のアプリケーションの設定を選択する。
  • Before launchセクションのMakeのチェックをはずし(これが遅い)、Run SBT Actionをチェックし「...」からtest-compileを選ぶ。

この状態でscalaソースを編集して緑矢印をクリック(Run)すると、SBTによるコンパイルが行われてからアプリが起動する。この際、左下のSBT Consoleを見てみると、コンソール起動状態でなくとも、勝手に起動されてコンパイルしていることがわかる。つまり、上の設定はSBTコンソールへのコンパイルコマンド投入を行うものであることが理解できる。

また、このSBTコンソールにて、直接compileとかtest-compileというコマンドを投入しても、やはりコンパイルされる。つまり、先のコンフィギュレーションでの指定は、単純に「アプリケーション実行前にSBTにこれこれのコマンドを投入せよ」と指示するものに過ぎないことがわかる。

自動コンパイルさせる

ソースファイルを編集してセーブしたら、その場で自動コンパイルさせることができる。これはSBTコンソールで「~test-compile」などと入力する。「~」というのは、「ファイルの変更があったらそれに続くコマンドを自動実行する」という意味らしい。この効果はSBTコンソールを終了するまで継続する(終了はexit)ので、やめたいときはいったんexitしてしまえばよい。

IntelliJのエディタで編集してセーブすると、たしかに自動的にコンパイルされていることがわかる。