4

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

我该怎么做呢?


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

1 回答 1

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
于 2015-03-24T07:39:14.570 回答