Table of Contents

Cross Project Tutorial 🔗

Sometimes you want to create multiple modules based on:

Since Deder builds are "just config", you can easily create multiple modules.
Create a deder.pkl file in your project root:

amends "https://sake92.github.io/deder/config/early-access/DederProject.pkl"

local const scalaVersions = List("2.13.18", "3.7.4")

local const commonModules: List<ScalaModule> =
  scalaVersions
    .map((sv) ->
        new CreateCrossModules {
          root = "common"
          template = new {
            scalaVersion = sv
          }
          jsTemplate = (template.asJs()) {
            scalaJsVersion = "1.20.2"
          }
          nativeTemplate = (template.asNative()) {
            scalaNativeVersion = "0.5.10"
          }
        }
      .get
      .all
    )
    .flatten()

modules {
  ...commonModules
}

This might seem a bit verbose, but it is very flexible.
The CreateCrossModules helper creates 3 modules for each scala version: one for JVM, one for JS, and one for Native.
Then the scalaVersions list specifies which scala versions you want to support. We loop through the scalaVersions list and create modules for each version, and then flatten the result to get a single list of modules.

For BSP/IDE import, Deder exposes only the latest Scala version of each platform family by default, so large cross-version builds stay manageable in Metals and IntelliJ. If you want to override that projection, set bspVisible on a module or helper template:

template = new {
  scalaVersion = sv
  bspVisible = sv == "2.13.18"
}

Finally, we add all the created modules to the modules section:

modules {
  ...commonModules
}

List all modules:

$ deder modules
common-js-2.13.18
common-js-3.7.4
common-jvm-2.13.18
common-jvm-3.7.4
common-jvm-test-2.13.18
common-jvm-test-3.7.4
common-native-2.13.18
common-native-3.7.4

You can even filter the commonModules list, if you want to remove some modules.
For example, if Scala Native is not ready for Scala 3.7.4, you can filter it out like this:

modules {
  ...commonModules.filter((m) -> !m.id.endsWith("-native-3.7.4"))
}
⬅️ Scala Native