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

Pha*_*mid 3 scala sbt

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

我发现文档re:SBT网站上的交叉构建在这里有点缺乏帮助。而且,尽管有几个与此主题相关的StackOverflow问答,但我找不到一个可以解决这一特定问题的问题。

Pha*_*mid 5

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

注意,该解决方案还解决了如何根据二进制版本设置依赖项版本的问题。我认为这可以在Stackoverflow的其他地方解决,但在同一地方。

  • 将“ scalaBinaryVersion”作为字符串进行匹配对于Scala的常规版本来说已经足够了,但是会破坏里程碑,发布候选对象,每晚等等。要完全正确,请使用例如`CrossVersion.partialVersion(scalaBinaryVersion.value)match {case Some((2,10))=> ... (2认同)