キャッシュ化タスク
このページではキャッシュ化タスクの詳細を説明する。概要の解説はキャッシュ化を参照。
自動キャッシュ
val someKey = taskKey[String]("something")
someKey := name.value + version.value + "!"
sbt 2.x では、タスク結果は name と version の 2 つのセッティングに基づいて自動的にキャッシュされる。初回実行時はオンサイトで実行されるが、2 回目以降はディスクキャッシュが使用される:
sbt:demo> show someKey
[info] demo0.1.0-SNAPSHOT!
[success] elapsed time: 0 s, cache 0%, 1 onsite task
sbt:demo> show someKey
[info] demo0.1.0-SNAPSHOT!
[success] elapsed time: 0 s, cache 100%, 1 disk cache hit
キャッシュ化はシリアライズ困難である
自動キャッシュに参加するには、入力キー(例: name と version)が sjsonnew.HashWriter 型クラス用の given を提供し、戻り値の型が sjsonnew.JsonFormat 用の given を提供する必要がある。Contraband で sjson-new のコーデックを生成できる。
エフェクトの追跡
ファイル作成のエフェクト
ファイル名を返すだけでなく、ファイル作成のエフェクトをキャッシュするには、Def.declareOutput(vf) を使ってファイル作成のエフェクトを追跡する必要がある。
someKey := {
val conv = fileConverter.value
val out: java.nio.file.Path = createFile(...)
val vf: xsbti.VirtualFile = conv.toVirtualFile(out)
Def.declareOutput(vf)
vf: xsbti.HashedVirtualFileRef
}
キャッシュからのオプトアウト
ビルド全体でのオプトアウト
デフォルトのカスタムタスクキャッシュをオプトアウトするには、project/plugins.sbt に以下を追加する:
Compile / scalacOptions += "-Xmacro-settings:sbt:no-default-task-cache"
タスクキー単位でのオプトアウト
次に、一部のタスクキーをキャッシュからオプトアウトしたい場合は、以下のようにキャッシュレベルを設定する:
@transient
val someKey = taskKey[String]("something")
または
@cacheLevel(include = Array.empty)
val someKey = taskKey[String]("something")
タスク単位でのオプトアウト
キャッシュを個別にオプトアウトするには、以下のように Def.uncached(...) を使用する:
val someKey = taskKey[String]("something")
someKey := Def.uncached {
name.value + somethingUncachable.value + "!"
}
リモート・キャッシュ
sbt 2.x は Bazel 互換の gRPC インターフェースを実装しており、オープンソースおよび商用の多数のバックエンドと連携する。詳細はリモート・キャッシュの設定を参照。