You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sbt自定义updateSnap命令仅首次生效,缓存问题如何解决?

解决Sbt updateSnap 命令重复执行被缓存的问题

这问题我之前处理过,核心原因是Sbt的任务缓存机制:默认情况下,update任务会根据输入(比如依赖配置、缓存策略等)是否变化来决定是否重新执行。你第一次执行updateSnap时,coursierTtl := None是新的配置,Sbt检测到变化就会正常运行update;但重复执行时,配置没有新的改动,Sbt认为任务输入未变,直接跳过执行复用缓存结果。

下面给你两种靠谱的解决方法:

方法一:利用Coursier的强制刷新设置

直接在命令中添加coursierForce := true,让Coursier每次都强制刷新依赖,忽略缓存:

def updateSnap = Command.command("updateSnap") { state =>
  import scala.concurrent.duration._
  val extracted = Project.extract(state)
  import extracted._
  val forcedState = appendWithSession(Seq(
    coursierTtl := None,
    coursierForce := true // 强制Coursier刷新依赖
  ), state)
  runTask(update, forcedState)
  state
}

这个方法最直接,专门针对Coursier的缓存机制,能确保每次执行updateSnap都会重新拉取最新的快照依赖。

方法二:动态修改update任务的输入

通过给update任务添加一个每次变化的输入(比如当前时间戳),让Sbt认为任务输入每次都不同,从而重新执行:

def updateSnap = Command.command("updateSnap") { state =>
  import scala.concurrent.duration._
  val extracted = Project.extract(state)
  import extracted._
  val dynamicState = appendWithSession(Seq(
    coursierTtl := None,
    // 添加当前时间戳作为动态输入,让Sbt每次都重新执行update
    Keys.update / Keys.inputs += sys.currentTimeMillis().toString
  ), state)
  runTask(update, dynamicState)
  state
}

这种方法属于通用的Sbt任务缓存破解方式,适合所有类似的任务缓存问题,但相对第一种方法稍显hack。

额外提示

如果你只是临时需要强制刷新,也可以直接在Sbt命令行执行:

sbt 'set coursierTtl := None; set coursierForce := true; update'

效果和你的updateSnap命令一致,适合临时调试用。

内容的提问来源于stack exchange,提问作者jilen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:35