I have a Scala project managed by SBT, with the following source folder structure:
src
|-main
| |-scala
| |-scala-2
| |-scala-3
The folder
scala contains code that compiles in Scala 2 and Scala 3.scala-2 contains code that is specific to Scala 2scala-3 contains code that is specific to Scala 3SBT handles the three folders well, switching from Scala 2 to Scala 3 and testing both works fine and even releasing JARs for Scala 2 and 3 works OK.
However, I use IntelliJ for development and I can't get it to work fine with two concurrent Scala versions. For instance, it will handle folders scala and scala-2, but ignore scala-3. This means I have all the IntelliJ features (like code inspection, auto-complete, etc) working for the two first folder, but not for the third folder.
How to correctly configure IntelliJ to handle different Scala versions and source codes?
I'm using:
Best you can do, is to disable some projects in IntelliJ and enable only the one you want to work on currently. For instance if I would like to only work on JVM 2.13 of projects cross compiled with sbt-projectmatrix (and sbt-commandmatrix):
// project/plugins.sbt
addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0")
addSbtPlugin("com.indoorvivants" % "sbt-commandmatrix" % "0.0.5")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0")
addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.7")
addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "1.1.0")
// build.sbt
val scala2_13version = "2.13.10"
val scala3version = "3.2.0"
// which version I want to use in my project
val ideScala = scala2_13version
Global / excludeLintKeys += ideSkipProject
val only1JvmScalaInIde = MatrixAction
.ForPlatforms(VirtualAxis.jvm)
.Configure(_.settings(ideSkipProject := (scalaVersion.value != ideScala)))
val noJsNoNativeInIde = MatrixAction
.ForPlatforms(VirtualAxis.js, VirtualAxis.native)
.Configure(_.settings(ideSkipProject := true))
val example = projectMatrix
.in(file("example"))
.someVariations(
List(scala2_13version, scala3version),
List(VirtualAxis.jvm, VirtualAxis.js, VirtualAxis.native)
)(only1JvmScalaInIde, noJsNoNativeInIde)
.settings(
// ...
)
val root = project
.in(file("."))
.aggregate(example.projectRefs: _*)
The crucial part is this
ideSkipProject := true
that you'd apply for all projects that you don't want IntelliJ to import (key comes from addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "1.1.0") plugin). You can adapt it to whatever other cross-compiling solution you are using.
Personally, I use this workflow above, where I set ideScala to either 2.13 or 3 and work only with 1 version at a time, and edit it and reload sbt when I need to switch. While these projects are not imported to IntelliJ, sbt still sees and builds all of them.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With