クロスビルド

同じソースファイルの集合から複数のターゲットに対してビルドすることをクロスビルドと呼ぶ。これは、複数の Scala リリースを対象とする Scala クロスビルド、JVM、Scala.JS、Scala Native を対象とするプラットフォーム・クロスビルド、Spark バージョンのような仮想軸を含む。

クロスビルドされたライブラリの使用

複数の Scala バージョンに対してビルドされたライブラリを使うには ModuleID の最初の % を 2重に %% とする。これは、依存性の名前に Scala ABI (アプリケーション・バイナリ・インターフェイス) サフィックスを付随するという sbt への指示となる。具体例を用いて説明すると:

libraryDependencies += "org.typelevel" %% "cats-effect" % "3.5.4"

現行 Scala バージョンが Scala 3.x であるならば、上の例は以下と等価となる:

libraryDependencies += "org.typelevel" % "cats-effect_3" % "3.5.4"

セットアップに関しては、cross building setup 参照。

歴史的経緯

Scala の初期時代 (Scala 2.9 以前) は、Scala 標準ライブラリがパッチレベルでもバイナリ互換性を保たなかったため、新しい Scala バージョンがリリースされるたびに全ライブラリが、新しい Scala バージョンに対して再リリースされる必要があった。そのため、ライブラリのユーザ側は、自分が使う Scala バージョンに互換の特定のライブラリのバージョンを選ぶ必要があった。

Scala 2.9.x 以降も Scala 標準ライブラリはマイナーレベルでの互換性を持たなかったため、Scala 2.10.x に対してコンパイルされたライブラリは 2.11.x と互換性を持たなかった。

これらの問題の対策として、sbt は以下の特徴を持つクロスビルド機構を開発した:

  • 同じソース・ファイルの集合から、複数の Scala バージョンに対してコンパイルできる
  • Maven のアーティファクト名に ABI バージョン (_2.12 など) を付随するという慣例を定義した
  • この機構は Scala.JS その他のプラットフォームもサポートするよう拡張された

Project matrix

sbt 2.x introduces project matrix, which enables cross building to happen in parallel.

organization := "com.example"
scalaVersion := "3.7.3"
version      := "0.1.0-SNAPSHOT"

lazy val core = (projectMatrix in file("core"))
  .settings(
    name := "core"
  )
  .jvmPlatform(scalaVersions = Seq("3.7.3", "2.13.17"))

セットアップに関しては、cross building setup 参照。