如何有条件地执行SBT任务

如何有条件地执行SBT任务,sbt,sbt-0.13,Sbt,Sbt 0.13,我有另一种方法来完成现有的昂贵任务,尽管直到运行时我才知道我是否会这样做。(例如,文件缓存。) 我该怎么做 例如,packageBin: packageBin in Compile := Def.taskDyn { if (canDoItMyWay) { doItMyWayTask } else { Defaults.packageTask } }.value 如果执行后一个路径,则此操作无效: $ sbt packageBin [trace] Stack tra

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

我该怎么做


例如,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.

以下是我的作品:

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中起作用+

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

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

但这不总是在编译任务中执行原始packageBin吗?我的想法是在某些情况下避免。只有当条件不成立时,我才编辑我的答案。这对你有用吗?