TL;DR:答案是否定的。它不保持秩序。让我们检查一下。
我创建了一个简单的build.sbt,其中包含:
val task1 = taskKey[Seq[String]]("taks1")
val task2 = taskKey[Seq[String]]("taks2")
val task3 = taskKey[Seq[String]]("taks3")
task1 := {
println("task1")
Seq("111")
}
task2 := {
println("task2")
Seq("222")
}
task3 := {
println("task3")
Seq("333")
}
然后添加:
task1 := task1.dependsOn(task2, task3).value
当运行 sbt task1 时,我得到一致的输出:
task2
task3
task1
这可能会让您认为后者是第一个执行的。这只是部分正确。让我们记住,这些操作是异步的。让我们添加一些睡眠和打印。让我们修改task2(应该先打印):
task2 := {
println("task2 started")
Thread.sleep(1000)
println("task2 finished")
Seq("222")
}
然后运行task1提供:
task2 started
task3
task2 finished
task1
这证明他们不维护秩序。如果您确实想保持秩序,有很多方法可以实现这一目标。例如:
task1 := task1.dependsOn(task3).dependsOn(task2).value
哪个输出:
task2 started
task2 finished
task3
task1
或者:
task1 := task1.dependsOn(task3).value
task1 := task1.dependsOn(task2).value
输出相同。或者你甚至可以将task2 声明为task3 的依赖:
task1 := task1.dependsOn(task3).value
task3 := task3.dependsOn(task2).value
输出相同。在做出决定之前,您可能需要阅读 Task graph 和 Scope delegation (.value lookup)。