如何有条件地调用 sbt 中的任务?

How to conditionally invoke a task in sbt?

taskA是一个繁重的任务,只有在启用时才应该调用,taskAEnabled是相应的设置键。

一个天真的方法是:

val taskAConditional = Def.task {
  (taskAEnabled, taskA) map { (taskAEnabled, taskA) => 
    if (taskAEnabled) taskA.value
  }
}

由于 sbt 设计,这将不起作用。由于 taskA 现在成为 taskAConditional 的依赖项,它将被执行而不管 if 逻辑(即 taskAEnabled 将被忽略)。

有什么方法可以实现我想要的吗? (我无法更改 taskA,因为它是从其他地方导入的)

在 sbt 0.13.x 你可以使用动态计算 Def.taskDyn:

val taskAConditional = Def.taskDyn {
  if (taskAEnabled.value) Def.task {
     taskA.value // this `.value` macro will extract result of taskA (execute it) only if taskAEnabled.value == true
  } 
}