Sbt:多任务排序

Sbt : multi task ordering

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

Task1.dependsOn(task3)
Task3.dependsOn(task2)

task2task3之前执行,然后task1执行。 现在如果我使用这个:

Task1.dependsOn(task2, task3)

sbt 是否保留任务顺序?所以执行顺序是 2 3 1 ?

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 and Scope delegation (.value lookup).