缓存任务
本页介绍缓存任务的细节。有关一般说明,请参阅缓存。
自动缓存
val someKey = taskKey[String]("something")
someKey := name.value + version.value + "!"
在 sbt 2.x 中,任务结果将根据 name 和 version 两个设置自动缓存。首次运行任务时将在现场执行,第二次起将使用磁盘缓存:
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 接口,可与多种开源和商业后端配合使用。详见 Remote cache setup。