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
  }
}

10-07 14:27