Scala 使用不同设置运行两次sbt任务

Scala 使用不同设置运行两次sbt任务,scala,sbt,Scala,Sbt,如何运行任务两次,第一次使用build.sbt中定义的设置,第二次使用其他设置?代码是这样的: val childSetting = settingKey[String]("Some setting") val childTask = taskKey[String]("Child task") childTask := ??? val parentTask = taskKey[String]("Parent task") parentTask := { val initial = c

如何运行任务两次,第一次使用
build.sbt
中定义的设置,第二次使用其他设置?代码是这样的:

val childSetting = settingKey[String]("Some setting")

val childTask = taskKey[String]("Child task")

childTask := ???

val parentTask = taskKey[String]("Parent task")

parentTask := {
  val initial = childTask.value
  // Do some stuff
  // Run childTask again with different setting
  // Do other stuff
}
sbt任务,例如,给定以下定义的
parentTask

val childSetting = settingKey[String]("Some setting")
childSetting := "Live long and prosper"

val childTask = taskKey[String]("Child task")
childTask := {
  val x = childSetting.value
  println(x)
  x
}

val parentTask = taskKey[String]("Parent task")
parentTask := {
  val initial = childTask.value
  val another = childTask.value
  initial
}
似乎我们在中执行了两次
childTask

parentTask := {
  val initial = childTask.value
  val another = childTask.value
  initial
}
然而,执行
sbtparenttask
我们可以看到副作用
println(x)
输出

Live long and prosper
Live long and prosper
...
nuqneH  
只有一次。因此,我们似乎不能简单地使用
value
macro,这是执行任务的推荐方式。试着像这样使用
runTask

parentTask := {
  val st = state.value
  val extracted = Project.extract(st)
  val (st2, initial) = extracted.runTask(childTask, st)
  val st3 = extracted.appendWithSession(Seq(childSetting := "nuqneH"), st2)
  val (st4, another) = Project.extract(st3).runTask(childTask, st3)
  another
}
现在执行
sbtparenttask
运行
println(x)
两次
childTask
的副作用,每次使用不同的状态

Live long and prosper
...
nuqneH 
但是,不建议直接使用
runTask
执行任务,因为这是sbt的优点

直接调用该任务将围绕依赖项进行结束运行 系统、并行执行系统等

并可能导致

小心runTask。它在sbt的任务图之外执行。可以 导致比赛条件等。参见:sbt/sbt#2970

或者,尝试定义一个命令,尽管命令的用法是类似的,例如,给定的

commands += Command.command("foo") { state =>
  "childTask" :: """set childSetting := "nuqneH"""" :: "childTask" :: state
}
执行
sbt foo
输出

Live long and prosper
Live long and prosper
...
nuqneH  
其中我们看到执行两次的
childTask
println(x)
副作用