キャッシュ化タスク

このページではキャッシュ化タスクの詳細を説明する。概要の解説はキャッシュ化を参照。

自動キャッシュ

val someKey = taskKey[String]("something")

someKey := name.value + version.value + "!"

sbt 2.x では、タスク結果は nameversion の 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

キャッシュ化はシリアライズ困難である

自動キャッシュに参加するには、入力キー(例: nameversion)が 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"

Note

これはビルドで導入したカスタムタスクにのみ適用される。sbt またはプラグインが提供するキャッシュ化タスクはキャッシュされたままである。

タスクキー単位でのオプトアウト

次に、一部のタスクキーをキャッシュからオプトアウトしたい場合は、以下のようにキャッシュレベルを設定する:

@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 インターフェースを実装しており、オープンソースおよび商用の多数のバックエンドと連携する。詳細はリモート・キャッシュの設定を参照。