2015-03-23 4 views
4

У меня есть альтернативный способ выполнения существующей дорогостоящей задачи, хотя я не знаю до выполнения, если я это сделаю. (Например, кеш файлов.)Как условно выполнить задачу 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. 

ответ

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
+0

Но не всегда, что выполнить первоначальную packageBin в задаче компиляции? Моя идея состояла в том, чтобы избежать некоторых ситуаций. –

+0

№ Если только условие не выполняется. –

+0

@PaulDraper Я отредактировал свой ответ. это работает для вас? –

Смежные вопросы