sbt vs Maven: Scala CIに適したbuildツールはどちら?
sbtは高速なインクリメンタルコンパイルを備えたScalaネイティブのbuildツールで、Mavenは規約駆動のJVM標準です。
sbt (the Scala Build Tool) はScala DSL、対話的なshell、Scala向けにチューニングされたZincベースのインクリメンタルコンパイルを提供します。Mavenは宣言的なXMLと規約を用い、広範なJVMエコシステムサポートとScala向けpluginを備えています。
| sbt | Maven | |
|---|---|---|
| 設定 | Scala DSL (build.sbt) | XML (pom.xml)、宣言的 |
| インクリメンタルコンパイル | 強力 (Zinc) | 限定的 (plugin経由) |
| Scalaへの焦点 | ネイティブ | scala-maven-plugin経由 |
| 対話的shell | あり (sbt console) | なし |
| 学習曲線 | 高い (Scala以外のdev向け) | 低い |
CIにおいて
sbtのZincインクリメンタルコンパイラとScalaを意識したtoolingは、Scalaの多いプロジェクトにとって自然な選択であり、温まったインクリメンタル状態はローカルのループを高速化できます。使い捨てのCI runnerでは、インクリメンタルの利点の多くは、実行間でコンパイラ出力をcacheすることに依存します。Mavenはよりシンプルで予測しやすく、複数言語のJVMスタックとクリーンに統合され、既に知っているチームにとって扱いやすいです。
CIでcacheする
sbtではIvy/Coursierのcacheとtarget/のbuild出力を、Mavenでは~/.m2/repositoryを、build定義をキーにしてcacheしましょう。CI実行間でインクリメンタルコンパイル状態を維持することが、sbtが速度の優位性を取り戻す場所です。
結論
ネイティブなtoolingと高速なインクリメンタルコンパイルを求めるScala優先のプロジェクト: sbt。混在したJVMスタック、またはMavenの規約とシンプルさを重視するチーム: Maven。どちらでも依存関係とbuild状態をcacheしてCIを高速に保ちましょう。