在SBT / SANE的共享设置定义中使用.value根据Scala版本组织设置



我想根据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)

最新更新