如何有条件地执行SBT任务

时间:2015-03-23 21:29:30

标签: sbt sbt-0.13

我有另一种方法来完成现有的昂贵任务,但是如果我以这种方式做到这一点,我直到运行时才会知道。 (例如,文件缓存。)

我该怎么做?


例如,packageBin:

packageBin in Compile := Def.taskDyn {
  if (canDoItMyWay) {
    doItMyWayTask
  } else {
    Defaults.packageTask
  }
}.value

如果它执行后一条路径,则不起作用:

$ sbt packageBin
[trace] Stack trace suppressed: run last compile:packageBin for the full output.
[error] (util-2_10/compile:packageBin) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.

1 个答案:

答案 0 :(得分:0)

以下内容适用于我:

val canDoItMyWay: Boolean = ...

//regular method. Not a task
def doItMyWay: File = ...

packageBin in Compile := {
    if(canDoItMyWay) doItMyWay
    else (packageBin in Compile).value
}

这里不需要使用动态任务。 请注意.value仅适用于sbt 0.13 +

另外,请注意我没有使用特殊的Task。只是常规代码。通过名称判断:doItMyWayTask表示您定义了一个任务。如果您使用自定义任务,则:

  • 需要吗?为什么一项任务?它取决于其他设置/任务吗?
  • 如果它必须是一项任务,请确保此处没有循环依赖,即它不应该依赖于packageBin