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

162

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

Kartoch
источник

Ответы:

117

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

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

tim_yates
источник
5
Вы также можете использовать TaskExecutionException, если задача не выполняется успешно. (Это верно в соответствии с документами Grade 1.11, я не уверен, когда это было представлено.)
Джош Ганьон
Есть ли здесь хорошие варианты синтаксиса? Рассмотрим синтаксис предварительных условий Котлина: require(something != whatever) { "No good!" }в отличие от более многословного и прообразногоif(something != whatever){ throw new GradleException("No good!") }
Groostav
Самое ужасное в том, GradleScriptExceptionчто для этого требуется второй параметр.
Трейказ
... Конечно, мы избегаем говорить, что это « программирование по исключениям » ?! Я написал кодировку, написанную таким образом, и это ужасно поддерживать ... В старые времена философия вокруг состояла в makeтом, что rules(задачи) были успешными или неудачными. Однажды я попробовал return false- Градл просто проигнорировал это и продолжил бежать.
будет
87

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

throw new GradleException('error occurred')

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

skipy
источник
28

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

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

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

Питер Нидервизер
источник
19

Другой вариант, если у вас нет желания перехватывать исключение позже, - вызвать задачу 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 от муравья?), Но если это цель, я бы не стал использовать ant.fail. Я бы просто показал, какое исключение нужно поймать, выбрасывая стандартное исключение gradle, как предложил tim_yates.

Гас
источник
Как мне это настроить? Назови это?
powder366
1
просто позвоните ant.fail («сообщение на ваш выбор»), настройка не требуется
Gus
2
Похоже, результат этого идентичен использованию throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert
@mgaert Я помню, что 4 года назад, когда я писал это, напечатанное сообщение действительно отличалось (но это долгое время, и мне не хочется выяснять, какая версия была текущей в то время, и проверять). Кроме того, IMHO ant.fail более четко сообщает о намерении полностью остановить сборку, тогда как выброшенное исключение читается как нечто, что может быть перехвачено и обработано.
Гас
12

Создание простого 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.')
}
edvox1138
источник
6

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

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выход не выводится. Любое другое значение напечатает standardOutput и остановит сборку.

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

cmcginty
источник