Scala向けの高速ビルドツールBloopについて

少し前にScala CenterからBloopというビルドツールがアナウンスされました。

github.com

実際に動かしてみたわけではないのですが、READMEやソースコードなどからどのようなものかは大体掴めるので簡単にまとめておきます。興味のある方は是非試してみて欲しいです。

Bloopはビルドツールと言ってもsbtを置き換えるものではありません(そもそもBloop自身はビルドツールを名乗っていません)。簡単に言えばnailgunでサーバを立ち上げてzincでインクリメンタルコンパイルするためのツールで、コーディング中のコンパイル確認用途に通常のビルドツールの代わりに使用することでコーディング→コンパイル確認のラウンドトリップを高速化することを狙っているようです。特にsbt以外のビルドツールを使っている場合にビルドツール側の対応を待たなくても最新のzincが使える点がメリットとして挙げられています。

なので、基本的には既存のビルドツールを使用しつつ、コーディング中はBloopを使うというスタイルになります。

なお、Bloop自体はソースディレクトリやコンパイルに必要なクラスパスなど必要最低限の設定で動作します。既存のビルドツール用の設定からこれらの情報を抽出して使用することが想定されているようですが、現状ではsbt用のプラグインしかないようです。

肝心のコンパイル速度ですが、以下のアナウンス時のブログ記事に、いくつかの中〜大規模Scalaプロジェクトをsbtでコンパイルした場合とBloopを使った場合のコンパイル時間の比較結果が掲載されています。

http://www.scala-lang.org/blog/2017/11/30/bloop-release.html

Sparkは1.4倍とBloopを使う恩恵が大きそうですが、sbtやScala本体だと1.1倍程度と微妙なところです。ただし、これはクリーンビルドの場合なので、本来Bloopのユースケースとして想定されているであろう部分ビルドの場合はまた変わってくるでしょうし、GradleやMavenでビルドしている場合はもっと大きな効果が見込めるのではないかと思います。

とはいえ、コンパイルがsbtプラグインに依存している場合は当然Bloopだけではビルドすることができないので結構使いどころが限られそうな感じがありますし、そもそもScalaをsbt以外のビルドツールでビルドしているのも割とレアケースなのではという気もします(何か理由があってsbtを使えないケースだとするとBloopも使えない場合が多そう)。また、Scala製大規模ソフトウェアのビルドの高速化に本気で取り組むのであればPantsなどの選択肢もあります。

ちょっと立ち位置が微妙な気がしなくもないのですが、手軽に導入できそうではあるのでとりあえず試してみるのはありかもしれません。