Gradle Задача exec возвращает ненулевое значение выхода и не выполняет сборку, но я хочу, чтобы она не сработала и вместо этого выполнила другую задачу

У меня есть задача exec, настроенная довольно по умолчанию, что-то вроде:

task myTask(type:Exec) {

    workingDir '.'

    commandLine './myscript.sh'

    doLast {
        if(execResult == 0) {
           //one thing
        } else {
           //another thing
        }
    }
}

Но, к сожалению, он никогда не выполняет блок doLast, когда ошибка вызывается script. Вместо этого он пропускает это и не выполняет всю сборку с помощью

Выполнение не выполнено для задачи ': project: myTask'. Процесс "command". /myscript.sh "завершен с ненулевым значением выхода 1"

Это бесполезно для меня. Вся идея завершения myscript.sh с ненулевым значением выхода - это то, что я могу выполнить некоторый код в ответ на него. Что мне нужно сделать, чтобы не вывести из строя сборку, но зафиксировать результат и выполнить действие в ответ? Спасибо за помощь!

Ответ 1

TL; DR - использовать ignoreExitValue = true

Когда я читал документацию примерно в пятидесятый раз, я наконец увидел, что есть свойство ignoreExitValue, которое по умолчанию имеет значение false. Но если вы установите значение true, вы сможете выполнять свои собственные задачи в блоке doLast.

task myTask(type:Exec) {

    workingDir '.'

    commandLine './myscript.sh'

    ignoreExitValue true

    doLast {
        if(execResult.getExitValue() == 0) {
           //one thing
        } else {
           //another thing
        }
    }
}

Ответ 2

Если ответ ignoreExitValue не работает, другое решение состоит в том, чтобы окружить commandLine try { ... } catch (Exception e() { ... }.