觸發執行
sbt 提供監控特定任務的輸入檔案,並在這些檔案發生變更時重複執行任務的功能。
以下描述一些範例用法
編譯
一個常見的用例是連續編譯。以下命令會使 sbt 監看 Test 和 Compile (預設) 組態中的來源變更,並重新執行 compile 命令。
> ~ Test / compile
> ~ compile
請注意,因為 `Test / compile` 依賴於 `Compile / compile`,主來源目錄中的來源變更將會觸發測試來源的重新編譯。
測試
在以測試驅動開發 (TDD) 方式進行開發時,通常會使用觸發執行。以下命令會監看建置的主來源和測試來源的變更,並僅重新執行自上次測試執行以來已重新編譯的類別所參考的測試。
> ~ testQuick
如果特定測試的相依性已變更,也可以僅重新執行該特定測試。
> ~ testQuick foo.BarTest
無論測試是否依賴任何已更新的來源檔案,都可以在偵測到來源變更時始終重新執行測試。
> ~ testOnly foo.BarTest
要在任何來源變更時執行專案中的所有測試,請使用
> ~test
執行多個命令
sbt 支援監看多個以分號分隔的命令。例如,以下命令將監看來源檔案變更,並執行 `clean` 和 `test`
> ~ clean; test
建置來源
如果建置設定為在建置來源變更時自動重新載入 (透過設定 `Global / onChangedBuildSource := ReloadOnSourceChanges`),則 sbt 將監看建置來源 (即 `project` 目錄中的 `*.sbt` 和 `*.{java,scala}` 檔案)。當偵測到建置來源變更時,建置將會重新載入,並且 sbt 將在重新載入完成時重新進入觸發執行模式。
可以將以下程式碼片段作為全域設定新增至 `~/.sbt/1.0/config.sbt`,以針對所有 sbt 1.3+ 建置啟用 `ReloadOnSourceChanges`,而不會中斷較舊的版本
Def.settings {
try {
val value = Class.forName("sbt.nio.Keys$ReloadOnSourceChanges$").getDeclaredField("MODULE$").get(null)
val clazz = Class.forName("sbt.nio.Keys$WatchBuildSourceOption")
val manifest = new scala.reflect.Manifest[AnyRef]{ def runtimeClass = clazz }
Seq(
Global / SettingKey[AnyRef]("onChangedBuildSource")(manifest, sbt.util.NoJsonWriter()) := value
)
} catch {
case e: Throwable =>
Nil
}
}
清除螢幕
sbt 可以在評估任務之前或觸發事件之後清除主控台螢幕。若要設定 sbt 在觸發事件之後清除螢幕,請新增
ThisBuild / watchTriggeredMessage := Watch.clearScreenOnTrigger
到建置設定。若要在執行任務之前清除螢幕,請新增
ThisBuild / watchBeforeCommand := Watch.clearScreen
到建置設定。
組態
觸發執行的行為可以透過多個設定進行組態。
- `watchTriggers: Seq[Glob]` 新增應該觸發任務評估,但任務不直接依賴的檔案的搜尋查詢。例如,如果專案 build.sbt 檔案包含 `foo / watchTriggers += baseDirectory.value.toGlob / "*.txt"`,則在觸發執行模式中,對以 `txt` 副檔名結尾的檔案進行任何修改,都將導致觸發 `foo` 命令。
- `watchTriggeredMessage: (Int, Path, Seq[String]) => Option[String]` 設定在檔案修改觸發新建置時顯示的訊息。其輸入參數是目前的監看迭代計數、觸發建置的檔案以及即將執行的命令。預設情況下,它會列印訊息,指出哪個檔案觸發了建置,以及即將執行的命令。當函式傳回 `None` 時,不會列印任何訊息。若要在列印訊息之前清除螢幕,只需在任務定義內新增 `Watch.clearScreen()`。這將確保螢幕已清除,並且會在螢幕清除之後列印訊息 (如果已定義)。
- `watchInputOptions: Seq[Watch.InputOption]` 允許建置覆寫預設的監看選項。例如,若要新增透過輸入 ‘l’ 鍵重新載入建置的功能,請將 `ThisBuild / watchInputOptions += Watch.InputOption('l', "reload", Watch.Reload)` 新增至 `build.sbt` 檔案。使用預設的 `watchStartMessage` 時,這也會將該選項新增至 ‘?’ 選項所顯示的清單中。
- `watchBeforeCommand: () => Unit` 提供一個回呼,以在評估任務之前執行。可以透過將 `ThisBuild / watchBeforeCommand := Watch.clearScreen` 新增至專案 build.sbt 檔案來清除主控台螢幕。預設情況下,它是 no-op。
- `watchLogLevel` 設定檔案監控系統的記錄層級。如果來源檔案已修改時未評估觸發執行,或者由於修改了不應監看的檔案而意外觸發,則這可能很有用。
- `watchInputParser: Parser[Watch.Action]` 變更監控器處理輸入事件的方式。例如,設定 `watchInputParser := 'l' ^^^ Watch.Reload | '\r' ^^^ new Watch.Run("")` 將會使得輸入 ‘l’ 鍵將會重新載入建置,而輸入換行符將會返回殼層。預設情況下,這會自動從 `watchInputOptions` 衍生。
- `watchStartMessage: (Int, ProjectRef, Seq[String]) => Option[String]` 設定監看程序等待檔案或輸入事件時列印的標題。輸入是迭代計數、目前的專案和要執行的命令。預設訊息包含終止監看或顯示所有可用選項的指示。僅當 `watchOnIteration` 記錄 `watchStartMessage` 的結果時,才會顯示此標題。
- `watchOnIteration: (Int, ProjectRef, Seq[String]) => Watch.Action` 是在等待來源或輸入事件之前評估的函式。例如,如果已達到特定數量的迭代,則可以用它來提早終止監看。預設情況下,它只會記錄 `watchStartMessage` 的結果。
- `watchForceTriggerOnAnyChange: Boolean` 設定來源檔案的內容是否必須變更才能觸發建置。預設值為 false。
- `watchPersistFileStamps: Boolean` 切換 sbt 是否會在多個任務評估執行中保存來源檔案計算的檔案雜湊。這可以提高具有許多來源檔案的專案的效能。由於檔案雜湊已快取,因此如果同時修改許多來源檔案,則已評估的任務可能會讀取無效的雜湊。預設值為 false。
- `watchAntiEntropy: FiniteDuration` 控制在先前觸發建置的相同檔案重新觸發建置之前必須經過的時間。這旨在防止檔案在短時間內進行修改時可能發生的虛假建置。預設值為 500 毫秒。