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)
副作用