sbtは、特定のタスクの入力ファイルを監視し、それらのファイルへの変更が発生したときにタスクを繰り返す機能を提供します。
いくつかの使用例を以下に示します。
一般的なユースケースは継続的なコンパイルです。次のコマンドは、sbtにテストおよびコンパイル(デフォルト)構成のソース変更をそれぞれ監視させ、コンパイルコマンドを再実行させます。
> ~ 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ミリ秒です。