SBT任务调度:如何实现类似Gradle mustRunAfter的执行顺序规则?
在SBT中实现类似Gradle的mustRunAfter任务顺序约束
你可以通过配置SBT的任务执行顺序优先级来实现需求:当同时指定regenTestResource和test任务时,确保前者先执行;单独执行test时,不会触发资源重新生成任务。
具体实现
在你的build.sbt中添加以下配置:
lazy val regenTestResource = taskKey[Unit]("regenerate src/test/resources/my_file.txt") regenTestResource := { s"${baseDirectory.value.getAbsolutePath}/regen_test_resource.sh" ! } // 设置任务执行顺序约束:当两个任务都要执行时,regenTestResource必须在test之前运行 Global / executionOrder += regenTestResource -> (Test / test)
原理说明
executionOrder是SBT的全局设置,用于定义无依赖关系的任务之间的执行优先级。当两个任务同时出现在执行队列中时,SBT会按照这个配置的顺序来执行它们。- 这种方式不会给
test任务添加硬依赖,因此单独执行sbt test时,regenTestResource不会被触发。 - 当你执行
sbt regenTestResource test时,SBT会严格保证regenTestResource执行完成后,才会启动test任务。
多模块项目适配
如果你的项目是多模块结构,可将作用域调整为全局构建级别,确保所有模块生效:
ThisBuild / executionOrder += regenTestResource -> (Test / test)
内容的提问来源于stack exchange,提问作者M. Justin
相关产品推荐
相关产品推荐

