我想基于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版本巧妙地组织设置组?
答案 0 :(得分:1)
您需要将条件检查移至里面设置定义,而不是从外部生成多个设置。
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")
}
}
}
答案 1 :(得分:0)
您可以创建功能来生成设置。例如:
def akaneSettings(scalaBinaryVersion: String) = Def.settings(
...
scalaBinaryVersion match {
...
}
)
...然后将其用作akaneSettings(scalaBinaryVersion.value)
。