在sbt中,如何使用一个版本中不需要的依赖项进行交叉构建?

时间:2016-12-30 22:11:07

标签: scala sbt

我需要与Scala 2.10和2.11(最终也是2.12)交叉构建项目。作为2.10一部分的一些软件包,例如解析器组合器,在2.11中独立打包。因此,它们不需要在2.10版本中提及,但在2.11中是必需的。此外,可能有不止一个这样的包,需要使用通用版本。

我发现documentation re: cross-building on the SBT site在这里缺乏帮助。而且,虽然有几个与此主题相关的StackOverflow Q& As,但我找不到解决这个问题的问题。

1 个答案:

答案 0 :(得分:4)

解决方案如下(仅显示 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"
)

请注意,此解决方案还解决了如何根据二进制版本设置依赖项版本的问题。我认为这可能会在Stackoverflow的其他地方解决,但在这里它们都在同一个地方。