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
相关产品推荐
相关产品推荐

