SBT:多任务排序

螺旋112

我想在sbt中使任务相互依赖。我希望任务task2先执行task3这是我的代码:

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

task2先执行task3然后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

哪个输出相同。在做出决定之前,您可能需要阅读“任务图”和“作用域委托”(.value查找)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章