Scala-SBTで伺かを実行する


Scala勉強会に参加したさいに、発表者が口を揃えてScalaのコンパイルが遅いと言っていたので、SBTで伺かを実行する方法を調べました。
コンパイルが遅いなら伺かのかけあいを見てればよいじゃない!!

タスクを追加する

SBTにタスクを追加するには下記のようにコードを追記します。

val sstp = taskKey[Unit]("sstp send script.")

sstp := {
}

1行目のval sstpでこの名前のタスクを作りますよと宣言して、3行目のsstp := { ... }でタスクと実行内容を紐づけます。
これをひな形として実際にSSTP通信を行い、伺かで実行するスクリプトを送信する処理を作成します。

ソケット通信を行う

Scalaだけではソケット通信は行えないのでJavaのライブラリを使用してソケット通信を行います。

import java.io._
import java.net.{ InetAddress, Socket }

val sstp = taskKey[Unit]("sstp send script.")

sstp := {
  val ia = InetAddress.getByName("localhost")
  val socket = new Socket(ia, 9801)
  val out = new DataOutputStream(socket.getOutputStream)
  val script = "SEND SSTP/1.1\r\n" +
               "Sender: sbt\r\n" +
               "Script: \\h\\s0SBTでコンパイルするよ\\u\\s0これでScalaのコンパイルをさらに長くできるな\\e\r\n" +
               "Charset: UTF-8\r\n"
  out.write(script.getBytes("UTF-8"))
  out.flush()
  out.close
  socket.close
}

注意点としてはout.write(script.getBytes("UTF-8"))でスクリプトで指定したcharsetのバイトを送信するようにしてください。
writeBytesや`writeUTFで文字列を送信すると伺か側で文字化けを起します。

2時間ハマりました。。

この状態でsbt sstpと実行すると伺かが喋りだします。

コンパイルの実行前にタスクを実行する

ここまで出来たら、あとはコンパイルの実行前にタスクを実行するように仕込むだけです。

compile <<= (compile in Compile) dependsOn sstp

上記のコードを追記するとsbt compileで伺かが喋りだしてくれます。


これでコンパイル時間が楽しくなれますね!!!
プラグイン化は誰か任せました。コンパイルの時間に合わせてランダムにかけあいをする素敵なプラグイン誰か作ってください。