Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SBT基于值执行代码_Sbt - Fatal编程技术网

SBT基于值执行代码

SBT基于值执行代码,sbt,Sbt,我想在SBT中执行以下操作: CrossVersion.partialVersion(scalaVersion.value) match { case Some((2, 11)) => case Some((2, 10)) => } 但我不想把它分配给任何东西,我只想基于当前交叉版本的值运行一些代码 我可以创建一个任务,然后执行该任务,但我可以不需要该任务就执行吗?我知道你说过你不想创建任务,但我认为这是最干净的方法,所以我还是将其作为解决方案之一发布 依赖于编译 重写编

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

CrossVersion.partialVersion(scalaVersion.value) match {
  case Some((2, 11)) =>
  case Some((2, 10)) => 
}
但我不想把它分配给任何东西,我只想基于当前交叉版本的值运行一些代码


我可以创建一个任务,然后执行该任务,但我可以不需要该任务就执行吗?

我知道你说过你不想创建任务,但我认为这是最干净的方法,所以我还是将其作为解决方案之一发布

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

只是@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
}

您希望这段代码什么时候运行(我的意思是在什么时候加载,通过另一个tasak,等等)?我猜这是构建的一部分。那么让我们假设默认编译阶段何时运行。为什么有时人们使用taskKey,而有时使用taskKey?嗯,
taskKey
是一个宏,
taskKey
是一个对象。如果这是一个为什么的问题,我不知道;)。当我谈到
build.sbt
时,我通常选择
taskKey
,当
build.scala
时,我选择
taskKey
,但我认为这并不重要。
taskKey
更短,因为您不必指定任务名称,因为它将从
val
中提取任务。啊,是的,我明白了。taskKey是一个从val生成名称的宏。Ok干杯。我喜欢你的解决方案。使用这个任务比我想象的要好。为什么这个任务不仅仅是一个设置?@JacekLaskowski我想你说的是
taskKey[Unit](“打印Scala版本”)
。OP在评论中表示,他希望以编译任务的方式运行它。您不能依赖于键。如果您认为这是有意义的,如果在加载时对键进行评估,那么您为什么需要依赖它们呢?当您的任务运行时,它们已被评估。
> 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))
lazy val printScalaVersion = taskKey[Unit]("Prints Scala version")

printScalaVersion := {
  sv.value foreach println
}