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
}
однако при выполнении sbt parentTask
мы видим побочный эффект println(x)
, выводящий
Live long and prosper
только один раз. Поэтому кажется, что мы не можем просто использовать макрос value
, который является рекомендуемым способом выполнения задач. Попробуйте использовать 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
}
Теперь выполняйте sbt parentTask
запускает println(x)
побочный эффект childTask
дважды, каждый раз с другим состоянием
Live long and prosper
...
nuqneH
Однако выполняйте задачи непосредственно с runTask
не рекомендуется, потому что он обходит сильные стороны sbt
При непосредственном вызове задачи завершается обход системы зависимостей, системы параллельного выполнения и т. д. c.
и может привести к условиям гонки
Будьте осторожны с runTask. Он выполняется вне графа задач sbt. Может привести к условиям гонки, и т. Д. c. См. Sbt / sbt # 2970
В качестве альтернативы попробуйте определить команду, хотя использование команд аналогично не рекомендуется , например, при выполнении
commands += Command.command("foo") { state =>
"childTask" :: """set childSetting := "nuqneH"""" :: "childTask" :: state
}
при выполнении sbt foo
выводит
Live long and prosper
...
nuqneH
, где мы видим println(x)
побочный эффект childTask
, выполненный дважды.