Рекомендуемый способ остановить сборку Gradle


Как я могу остановить сборку Gradle после обнаружения проблемы? Я могу использовать assert, бросить исключение, сделать систему.выход (плохая идея), или использовать специальную функцию в Gradle (но я не мог найти один). Каков наилучший способ для Gradle (и почему?).

6 122

6 ответов:

Я обычно бросаю соответствующее исключение из org.gradle.api пакета, например InvalidUserDataException когда кто-то вошел, что-то недопустимое, или GradleScriptException для более общих ошибок.

если вы хотите остановить текущую задачу или действие и перейти к следующему, вы также можете бросить StopActionException

Если вы хотите остановить сборку, бросьте:

throw new GradleException('error occurred')

или бросить подклассы для выше исключение. Некоторые исключения подкласса фактически только завершают выполнение текущей задачи, но продолжают сборку.

В настоящее время нет специального метода, хотя были обсуждения, чтобы добавить один.

рекомендуемый способ остановить сборку Gradle-это создать исключение. Поскольку Groovy не имеет проверенных исключений, а Gradle по умолчанию не печатает тип исключения, это не так критично, какое исключение выбрасывается. В сценариях сборки часто используется GradleException, но также кажется разумным утверждение Groovy (в зависимости от обстоятельств и аудитории). Что важно это должно обеспечить четкое сообщение. Добавление причины (Если доступно) помогает при отладке (--stacktrace).

Gradle предоставляет выделенные типы исключений StopExecutionException/StopActionException для остановки текущей задачи / действия задачи, но продолжения сборки.

другой вариант, если у вас нет никакого желания, чтобы иметь возможность поймать исключение позже, чтобы вызвать задачу Ant fail. Это немного легче читать на мой взгляд, и вы можете дать хорошее сообщение пользователю без использования --stacktrace.

task (tarball, dependsOn: warAdmin) << {
    ant.fail('The sky is falling!!')
}

выдает сообщение:

* What went wrong:
Execution failed for task ':tarball'.
> The sky is falling!!

наверное можете поймать это (возможно, он бросает BuildException муравья?) но если это цель, то я бы не муравей.неудача. Я бы просто сделал это легко увидеть, какое исключение поймать, бросив стандартное исключение gradle, как предложил tim_yates.

бросание простого GradleException работает при остановке сценария сборки. Это отлично работает для проверка настройки среды.

GradleException('your message, why the script is stopped.')

пример:

if(null == System.getenv()['GRADLE_USER_HOME']) {
    throw new GradleException('Required GRADLE_USER_HOME environment variable not set.')
}

вот фрагмент кода, который пытается эмулировать, как задача Gradle javac выдает ошибки:

task myCommand(type:Exec) {

    ... normal task setup ....

    ignoreExitValue true
    standardOutput = new ByteArrayOutputStream()
    ext.output = { standardOutput.toString() }
    doLast {
        if (execResult.exitValue) {
            logger.error(output())
            throw new TaskExecutionException( it,
                new Exception( "Command '${commandLine.join(' ')}' failed; "
                              + "see task output for details." )
            )
        }
    }
}

когда команда возвращает 0 нет выхода. Любое другое значение выведет стандартный вывод и остановит сборку.

Примечание: Если ваша команда также записывает в errorOutput, вам может потребоваться включить это в журнал ошибок.