mirror of https://github.com/sbt/sbt.git
158 lines
4.1 KiB
Markdown
158 lines
4.1 KiB
Markdown
sbt-projectmatrix
|
|
=================
|
|
|
|
cross building using subprojects.
|
|
|
|
This is an experimental plugin that implements better cross building.
|
|
|
|
setup
|
|
-----
|
|
|
|
**Requirements**: Requires sbt 1.2.0 or above.
|
|
|
|
In `project/plugins.sbt`:
|
|
|
|
```scala
|
|
addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.3.0")
|
|
|
|
// add also the following for Scala.js support
|
|
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.27")
|
|
```
|
|
|
|
usage
|
|
-----
|
|
|
|
### building against multiple Scala versions
|
|
|
|
After adding sbt-projectmatrix to your build, here's how you can set up a matrix with two Scala versions.
|
|
|
|
```scala
|
|
ThisBuild / organization := "com.example"
|
|
ThisBuild / scalaVersion := "2.12.8"
|
|
ThisBuild / version := "0.1.0-SNAPSHOT"
|
|
|
|
lazy val core = (projectMatrix in file("core"))
|
|
.settings(
|
|
name := "core"
|
|
)
|
|
.jvmPlatform(scalaVersions = Seq("2.12.8", "2.11.12"))
|
|
```
|
|
|
|
This will create subprojects `coreJVM2_11` and `coreJVM2_12`.
|
|
Unlike `++` style stateful cross building, these will build in parallel.
|
|
|
|
### two matrices
|
|
|
|
It gets more interesting if you have more than one matrix.
|
|
|
|
```scala
|
|
ThisBuild / organization := "com.example"
|
|
ThisBuild / scalaVersion := "2.12.8"
|
|
ThisBuild / version := "0.1.0-SNAPSHOT"
|
|
|
|
// uncomment if you want root
|
|
// lazy val root = (project in file("."))
|
|
// .aggregate(core.projectRefs ++ app.projectRefs: _*)
|
|
// .settings(
|
|
// )
|
|
|
|
lazy val core = (projectMatrix in file("core"))
|
|
.settings(
|
|
name := "core"
|
|
)
|
|
.jvmPlatform(scalaVersions = Seq("2.12.8", "2.11.12"))
|
|
|
|
lazy val app = (projectMatrix in file("app"))
|
|
.dependsOn(core)
|
|
.settings(
|
|
name := "app"
|
|
)
|
|
.jvmPlatform(scalaVersions = Seq("2.12.8"))
|
|
```
|
|
|
|
This is an example where `core` builds against Scala 2.11 and 2.12, but app only builds for one of them.
|
|
|
|
### Scala.js support
|
|
|
|
[Scala.js](http://scala-js.org/) support was added in sbt-projectmatrix 0.2.0.
|
|
To use this, you need to setup sbt-scalajs as well:
|
|
|
|
```scala
|
|
lazy val core = (projectMatrix in file("core"))
|
|
.settings(
|
|
name := "core"
|
|
)
|
|
.jsPlatform(scalaVersions = Seq("2.12.8", "2.11.12"))
|
|
```
|
|
|
|
This will create subprojects `coreJS2_11` and `coreJS2_12`.
|
|
|
|
### Scala Native support
|
|
|
|
[Scala Native](http://scala-native.org) support will be added in upcoming release.
|
|
To use this, you need to setup sbt-scala-native` as well:
|
|
|
|
```scala
|
|
lazy val core = (projectMatrix in file("core"))
|
|
.settings(
|
|
name := "core"
|
|
)
|
|
.nativePlatform(scalaVersions = Seq("2.11.12"))
|
|
```
|
|
|
|
This will create subproject `coreNative2_11`.
|
|
|
|
### parallel cross-library building
|
|
|
|
The rows can also be used for parallel cross-library building.
|
|
For example, if you want to build against Config 1.2 and Config 1.3, you can do something like this:
|
|
|
|
```scala
|
|
ThisBuild / organization := "com.example"
|
|
ThisBuild / version := "0.1.0-SNAPSHOT"
|
|
|
|
lazy val core = (projectMatrix in file("core"))
|
|
.settings(
|
|
name := "core"
|
|
)
|
|
.crossLibrary(
|
|
scalaVersions = Seq("2.12.8", "2.11.12"),
|
|
suffix = "Config1.2",
|
|
settings = Seq(
|
|
libraryDependencies += "com.typesafe" % "config" % "1.2.1"
|
|
)
|
|
)
|
|
.crossLibrary(
|
|
scalaVersions = Seq("2.12.8"),
|
|
suffix = "Config1.3",
|
|
settings = Seq(
|
|
libraryDependencies += "com.typesafe" % "config" % "1.3.3"
|
|
)
|
|
)
|
|
```
|
|
|
|
This will create `coreConfig1_22_11`, `coreConfig1_22_12`, and `coreConfig1_32_12` respectively producing `core_config1.3_2.12`, `core_config1.2_2.11`, and `core_config1.2_2.12` artifacts.
|
|
|
|
### referncing the generated subprojects
|
|
|
|
You might want to reference to one of the projects within `build.sbt`.
|
|
|
|
```scala
|
|
lazy val core12 = core.jvm("2.12.8")
|
|
|
|
// lazy val core12 = core.crossLib("Config1.2")("2.12.8")
|
|
```
|
|
|
|
In the above `core12` returns `Project` type.
|
|
|
|
credits
|
|
-------
|
|
|
|
- The idea of representing cross build using subproject was pionieered by Tobias Schlatter's work on Scala.js plugin, which was later expanded to [ sbt-crossproject](https://github.com/portable-scala/sbt-crossproject). However, this only addresses the platform (JVM, JS, Native) cross building.
|
|
- [sbt-cross](https://github.com/lucidsoftware/sbt-cross) written by Paul Draper in 2015 implements cross building across Scala versions.
|
|
|
|
license
|
|
-------
|
|
|
|
MIT License
|