sbt как получить результат (успех / неудача) компиляции в задаче sbt - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь написать задачу sbt, которая проверяет, успешно ли выполняется компиляция кода, и на основании этой информации что-то делает. Пока у меня есть это:

https://github.com/JohnReedLOL/WeirdSbtBug/blob/894f497567477619b4150de92c6bb2c146a1b615/build.sbt#L46

Когда компиляция не удалась, она распечатала это:

[warn] Compile: Inc(Incomplete(node=Some(Task((taskDefinitionKey: ScopedKey(Scope(Select(ProjectRef(file:/Users/john-michaelreed/Downloads/NewDownloads/sbt-0.13/lesson/HelloScala1/,helloscala1)),Select(ConfigKey(compile)),Global,Global),compile)))), tpe=Error, msg=None, causes=List(Incomplete(node=Some(Task((tags: Map(Tag(compile) -> 1, Tag(cpu) -> 1), taskDefinitionKey: ScopedKey(Scope(Select(ProjectRef(file:/Users/john-michaelreed/Downloads/NewDownloads/sbt-0.13/lesson/HelloScala1/,helloscala1)),Select(ConfigKey(compile)),Global,Global),compileIncremental)))), tpe=Error, msg=None, causes=List(), directCause=Some(Compilation failed))), directCause=None)) !

, который содержит строку "Компиляция не удалась". Я мог бы проверить, присутствует ли эта строка и, основываясь на результате, сделать что-то.

Пример:

val monitorTask = taskKey[Unit]("A task that gets the result of compile.")
monitorTask in Scope.GlobalScope := {
  // monitorTask dependencies:
  val log = streams.value.log // streams task happens-before monitorTask
  val compileResult = (compile.in(Compile)).result.value // compile task happens-before monitorTask

  // ---- monitorTask begins here ----
  if(compileResult.toString.contains("Compilation failed")) {
    log.warn("Compilation failed!")
    // Do stuff
  } else {
    log.info("Compilation succeeded!")
    // Do other stuff
  }
}

Но это выглядит немного хрупким. Есть ли лучший способ сделать это?

p.s. В процессе тестирования monitorTask я столкнулся с этой ошибкой: https://github.com/sbt/sbt/issues/4444

1 Ответ

0 голосов
/ 14 декабря 2018

Если вам нужна двоичная информация об успехе или сбое, почему бы не позвонить toEither на .result.value? Затем вы можете проверить, если это isRight.

...