2016-11-22 3 views
1

Возможно ли выполнить команду в Sbt Task? Если да, то как? как Команде требуется государство, как я могу его получить?В Sbt, как выполнить команду в задаче

Я пытаюсь переопределить задачу по умолчанию, вот что я пытался

dist := { 
    println("Turning coverage off") 
    Command.process("coverageOff") 
    dist.value 
} 

Сигнатура Command.process является (string, state) => _

Я нету выяснить, где, чтобы получить государство

ответ

5

Да, вы можете запустить команду в рамках задачи. Вот что я сейчас делаю, чтобы достичь этого. Во-первых, определить следующий метод в сборке:

/** 
    * Convert the given command string to a release step action, preserving and  invoking remaining commands 
    * Note: This was copied from https://github.com/sbt/sbt-release/blob/663cfd426361484228a21a1244b2e6b0f7656bdf/src/main/scala/ReleasePlugin.scala#L99-L115 
    */ 
def runCommandAndRemaining(command: String): State => State = { st: State => 
    import sbt.complete.Parser 
    @annotation.tailrec 
    def runCommand(command: String, state: State): State = { 
    val nextState = Parser.parse(command, state.combinedParser) match { 
     case Right(cmd) => cmd() 
     case Left(msg) => throw sys.error(s"Invalid programmatic input:\n$msg") 
    } 
    nextState.remainingCommands.toList match { 
     case Nil => nextState 
     case head :: tail => runCommand(head, nextState.copy(remainingCommands = tail)) 
    } 
    } 
    runCommand(command, st.copy(remainingCommands = Nil)).copy(remainingCommands = st.remainingCommands) 
} 

Затем, просто вызовите любую команду в рамках задачи, используя определенную выше утилиту, например, runCommandAndRemaining("+myProject/publishLocal")(state.value).

В вашем конкретном случае, она должна сводиться к

dist := { 
    val log = streams.value.log 
    log.debug("Turning coverage off") 
    runCommandAndRemaining("coverageOff")(state.value) 
    dist.value 
} 

Надежда это помогает!

0

Получив некоторую помощь от gitter, это невозможно, но вы можете сделать обратное, вызовите задачу в команде.

Так что, если ваш случай использования для выполнения команды и задачи последовательно (или наоборот), вы можете сделать что-то вроде этого

lazy val newCommand = Command.command("name") { state => 
    val newState = Command.process("comandName", state) 
    // run task 
    newState 
} 
Смежные вопросы