最常被問到的問題之一是「如何在 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
),而不是多次編譯相同的來源。
由於任務系統通常是這樣設定的,因此依序執行某些事情是可行的,但您將會與系統抗衡,而且不一定總是容易的。