Как условно выполнить задачу SBT

У меня есть альтернативный способ завершения существующей дорогой задачи, хотя я не знаю до времени выполнения, буду ли я делать это таким образом. (Например, файловый кеш.)

Как мне это сделать?


Например, 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 ответ

Следующие работы для меня:

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
Другие вопросы по тегам