SBT基于值执行代码

时间:2014-05-14 14:50:27

标签: sbt

我想在SBT中执行以下操作:

CrossVersion.partialVersion(scalaVersion.value) match {
  case Some((2, 11)) =>
  case Some((2, 10)) => 
}

但我不想将其分配给任何内容,我只想根据当前交叉版本的值运行一些代码。

我可以创建一个Task然后执行任务,但是我可以在不需要任务的情况下执行此操作吗?

2 个答案:

答案 0 :(得分:1)

我知道你已经说过你不想创建一个任务,但我会说这是最干净的方式,所以我将其发布为无论如何,解决方案。

取决于编译

val printScalaVersion = taskKey[Unit]("Prints Scala version")

printScalaVersion := {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((2, 11)) => println("2.11")
    case Some((2, 10)) => println("2.10")
    case _ => println("Other version")
  }
}

compile in Compile := ((compile in Compile) dependsOn printScalaVersion).value

覆盖编译任务

如果您真的不想创建新任务,可以重新定义编译任务并在那里添加代码(我认为它不像上面的解决方案那样干净)。

compile in Compile := {
  val analysis = (compile in Compile).value
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((2, 11)) => println("2.11")
    case Some((2, 10)) => println("2.10")
    case _ => println("Other version")
  }
  analysis
}

答案 1 :(得分:0)

只是一个小小的"增强" @lpiepiora提供的内容。

可能会有一个设置,其中包含CrossVersion.partialVersion(scalaVersion.value)的值,如下所示:

lazy val sv = settingKey[Option[(Int, Int)]]("")

sv := CrossVersion.partialVersion(scalaVersion.value)

使用以下设置:

> sv
[info] Some((2,10))
> ++ "2.9.3"
[info] Setting version to 2.9.3
[info] Set current project to projectA (in build file:/C:/dev/sandbox/scalaVersionSetting/)
> sv
[info] Some((2,9))
> ++ "2.10.4"
[info] Setting version to 2.10.4
[info] Set current project to projectA (in build file:/C:/dev/sandbox/scalaVersionSetting/)
> sv
[info] Some((2,10))
> ++ "2.11"
[info] Setting version to 2.11
[info] Set current project to projectA (in build file:/C:/dev/sandbox/scalaVersionSetting/)
> sv
[info] Some((2,11))

......等等。

这样可以设置为case

lazy val printScalaVersion = taskKey[Unit]("Prints Scala version")

printScalaVersion := {
  sv.value foreach println
}