Scala 多任务排序

Scala 多任务排序,scala,sbt,task,Scala,Sbt,Task,我想让任务在sbt中相互依赖。我希望任务task2在task3之前执行。 这是我的密码: Task1.dependsOn(task3) Task3.dependsOn(task2) task2在执行task3之前执行,然后执行task1。 现在如果我用这个: Task1.dependsOn(task2, task3) sbt是否保留任务的顺序?因此,执行顺序为2 3 1?TL;医生:答案是否定的。它不能维持秩序。让我们检查一下这个 我创建了一个简单的build.sbt,其中包含: val t

我想让任务在sbt中相互依赖。我希望任务
task2
task3
之前执行。 这是我的密码:

Task1.dependsOn(task3)
Task3.dependsOn(task2)
task2
在执行
task3
之前执行,然后执行
task1
。 现在如果我用这个:

Task1.dependsOn(task2, task3)

sbt是否保留任务的顺序?因此,执行顺序为2 3 1?

TL;医生:答案是否定的。它不能维持秩序。让我们检查一下这个

我创建了一个简单的
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
这可能会使您认为后者是第一个执行的。这只是部分正确。让我们记住这些操作是异步的。让我们添加一些睡眠和照片。让我们修改任务2(应该先打印哪个):

然后运行
task1
提供:

task2 started
task3
task2 finished
task1
这证明他们不能维持秩序。如果你想维持秩序,有很多方法可以做到。例如:

task1 := task1.dependsOn(task3).dependsOn(task2).value
哪些产出:

task2 started
task2 finished
task3
task1
或:

哪个输出相同。或者您甚至可以将
task2
声明为
task3
的依赖项:

task1 := task1.dependsOn(task3).value
task3 := task3.dependsOn(task2).value
哪个输出相同。在做出决定之前,您可能需要阅读和阅读

task1 := task1.dependsOn(task3).value
task1 := task1.dependsOn(task2).value
task1 := task1.dependsOn(task3).value
task3 := task3.dependsOn(task2).value