SBT远程缓存异常失效问题咨询
环境信息
sbt=1.8.0 jdk=Amazon.com Inc. Java 1.8.0_342
我通过sbt new ...创建了一个简单Scala项目,目录结构如下:
. ├── main │ └── scala │ └── example │ ├── A.scala │ ├── B.scala │ ├── C.scala │ ├── D.scala │ ├── E.scala │ └── Hello.scala └── test └── scala └── example └── HelloSpec.scala
项目的build.sbt配置如下:
import Dependencies._ ThisBuild / scalaVersion := "2.13.8" ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / organization := "com.example" ThisBuild / organizationName := "example" ThisBuild / pushRemoteCacheTo := Some(MavenCache("local-cache", file("/tmp/cache"))) ThisBuild / logLevel := Level.Debug ThisBuild / incOptions := incOptions.value.withApiDebug(true).withRelationsDebug(true) lazy val root = (project in file(".")) .settings( name := "helloworldsbt", libraryDependencies += scalaTest % Test )
执行命令sbt "; compile; pushRemoteCache;"推送缓存后,缓存目录结构如下:
[19:26:51] ➜ helloworldsbt cd /tmp/cache/com/example/helloworldsbt_2.13 [19:27:59] ➜ helloworldsbt_2.13 tree . ├── 0.0.0-55c7c2b9b2d9068c │ ├── helloworldsbt_2.13-0.0.0-55c7c2b9b2d9068c-cached-test.jar │ ├── helloworldsbt_2.13-0.0.0-55c7c2b9b2d9068c-cached-test.jar.md5 │ └── helloworldsbt_2.13-0.0.0-55c7c2b9b2d9068c-cached-test.jar.sha1 └── 0.0.0-f0c3847d849b0a58 ├── helloworldsbt_2.13-0.0.0-f0c3847d849b0a58-cached-compile.jar ├── helloworldsbt_2.13-0.0.0-f0c3847d849b0a58-cached-compile.jar.md5 └── helloworldsbt_2.13-0.0.0-f0c3847d849b0a58-cached-compile.jar.sha1
随后我将项目复制到其他子目录(同名),仅修改了一个文件,执行sbt "pullRemoteCache; compile;"时却触发了全量编译,日志显示:
[debug] Full compilation, no sources in previous analysis. [debug] all 6 sources are invalidated [info] compiling 6 Scala sources to /Users/faiz.halde/p/helloworldsbt/target/scala-2.13/classes ...
我是不是误解了SBT远程缓存的用法?为什么远程缓存里不包含源信息,导致触发全量编译?
问题原因及解决方法
sbt远程缓存默认仅存储编译产物(如jar包)和依赖哈希,不会同步记录源文件依赖关系、变更追踪的编译分析文件(analysis数据)。当拉取缓存后,本地无历史编译分析记录,sbt无法判断哪些文件需要增量编译,只能触发全量编译。
要实现增量编译的缓存支持,需修改配置让远程缓存包含编译分析相关内容:
- 在
build.sbt中添加如下配置,让推送缓存时包含编译分析和编译环境配置:
ThisBuild / pushRemoteCacheConfiguration := pushRemoteCacheConfiguration.value.withCacheKeys( pushRemoteCacheConfiguration.value.cacheKeys ++ Seq(compileAnalysis, compileSetup) )
- 该配置会自动处理拉取逻辑,拉取缓存时同步获取分析文件。
另外,sbt远程缓存基于输入哈希匹配:只有项目输入(源文件哈希、依赖、编译配置等)与缓存完全匹配时,才会直接复用编译产物。修改单个文件后,若没有分析数据,sbt无法追踪依赖关联,只能全量编译。添加上述配置后,缓存目录会新增分析相关文件(如analysis.bin),拉取后就能基于这些数据实现增量编译。
内容的提问来源于stack exchange,提问作者ffff
相关产品推荐
相关产品推荐

