最常见的问题之一是“如何在 sbt 中执行 X,然后 执行 Y”?
一般来说,这不是 sbt 任务的设置方式。build.sbt 是一个 DSL,用于定义任务的依赖关系图。这在 任务执行语义 中有介绍。所以理想情况下,你应该自己定义任务 Y,并依赖于任务 X。
taskY := {
val x = taskX.value
x + 1
}
这与带有副作用的命令式纯 Scala 代码相比更加受限,例如:
def foo(): Unit = {
doX()
doY()
}
依赖关系导向的编程模型的优点是 sbt 的任务引擎能够重新排序任务执行。在可能的情况下,我们并行运行依赖任务。另一个优点是我们可以对图进行去重,并确保任务评估(例如 Compile / compile
)在每次命令执行时只调用一次,而不是多次编译相同的源代码。
由于任务系统通常以这种方式设置,所以运行顺序执行的操作是可能的,但你将会与系统斗争,并且它并不总是那么容易。