Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In sbt, how can I cross-build with dependencies that are not required in one version?

Tags:

scala

sbt

I need to cross-build a project with both Scala 2.10 and 2.11 (and ultimately 2.12 also). Some packages that were part of 2.10, for example parser-combinators, are packaged independently in 2.11. Thus they are not required to be mentioned in the 2.10 build but are required in 2.11. Furthermore, there may be more than one such package, which are required to use a common version.

I found the documentation re: cross-building on the SBT site to be somewhat lacking in helpfulness here. And, although, there are several StackOverflow Q&As which relate to this subject, I could not find one that addressed this specific point.

like image 551
Phasmid Avatar asked Mar 10 '23 06:03

Phasmid


1 Answers

The solution is as follows (showing only the relevant part of build.sbt):

scalaVersion := "2.10.6"
crossScalaVersions := Seq("2.10.6","2.11.8")

val scalaModules = "org.scala-lang.modules"
val scalaModulesVersion = "1.0.4"

val akkaGroup = "com.typesafe.akka"
lazy val akkaVersion = SettingKey[String]("akkaVersion")
lazy val scalaTestVersion = SettingKey[String]("scalaTestVersion")

akkaVersion := (scalaBinaryVersion.value match {
  case "2.10" => "2.3.15"
  case "2.11" => "2.4.1"
})
scalaTestVersion := (scalaBinaryVersion.value match {
  case "2.10" => "2.2.6"
  case "2.11" => "3.0.1"
})

libraryDependencies ++= (scalaBinaryVersion.value match {
  case "2.11" => Seq(
    scalaModules %% "scala-parser-combinators" % scalaModulesVersion,
    scalaModules %% "scala-xml" % scalaModulesVersion,
    "com.typesafe.scala-logging" %% "scala-logging" % "3.4.0"
  )
  case _ => Seq()
}
)

libraryDependencies ++= Seq(
  akkaGroup %% "akka-actor" % akkaVersion.value % "test",
  "org.scalatest" %% "scalatest" % scalaTestVersion.value % "test"
)

Note that this solution also addresses the problem of how to set the version of a dependency(ies) according to the binary version. I think this may be addressed elsewhere in Stackoverflow but here it is all in the same place.

like image 173
Phasmid Avatar answered Mar 13 '23 06:03

Phasmid