我想根据Scala二进制版本提供多个设置。这些设置将在几个项目之间共享。
类似:
lazy val akaneSettings = Def.settings(
organization := "ws.kotonoha",
moduleName := "akane",
crossScalaVersions := Seq("2.11.12", "2.12.4"),
scalaVersion := "2.11.12",
version := "0.2-SNAPSHOT",
javacOptions ++= Seq("-encoding", "utf8"),
scalacOptions ++= Seq(
"-feature",
"-deprecation"
),
scalaBinaryVersion.value match {
case "2.11" =>
Def.settings(
scalacOptions ++= Seq(
"-Ybackend:GenBCode",
"-Yopt:l:classpath",
"-Yopt-warnings",
"-target:jvm-1.8"
),
libraryDependencies ++= Seq("org.scala-lang.modules" % "scala-java8-compat_2.11" % "0.8.0")
)
case "2.12" =>
Def.settings(
scalacOptions ++= Seq(
"-opt:l:classpath"
)
)
case _ => throw new Exception("Not supported yet")
}
}
)
不幸的是,value上的模式匹配不起作用:它要求我在宏观上下文中使用它。
当然,我可以为每个单独的设置进行分支逻辑:=/ =,但这会留下混乱。有没有一种方法可以根据Scala版本来组织设置组?
您需要将条件检查移至内部 设置定义,而不是从外部生成多个设置。。
SBT的语法可能会给您留下深刻的印象,即您以可变的方式更新值,例如使用:=
操作员,但不是。每个设置转换都被存储以供以后组成和应用。在定义akaneSettings
的点,scalaBinaryVersion
的值尚不清楚(实际上可能会根据所评估的上下文而有所不同(。
您的示例应该看起来像:
// No need to use Def.Setting in recent SBT versions
lazy val akaneSettings = Seq(
organization := "ws.kotonoha",
// ...,
scalacOptions ++= {
scalaBinaryVersion.value match {
case "2.11" =>
Seq("-some-2.11-setting")
case "2.12" =>
Seq("-some-2.12-setting")
case _ =>
sys.error("Only Scala 2.11 and 2.12 are supported")
}
},
libraryDependencies ++= {
scalaBinaryVersion.value match {
case "2.11" =>
Seq("org.scala-lang.modules" % "scala-java8-compat_2.11" % "0.8.0")
case "2.12" =>
Seq.empty
case _ =>
sys.error("Only Scala 2.11 and 2.12 are supported")
}
}
}
您可以创建功能来生成设置。例如:
def akaneSettings(scalaBinaryVersion: String) = Def.settings(
...
scalaBinaryVersion match {
...
}
)
...然后将其用作akaneSettings(scalaBinaryVersion.value)
。