Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

throw new GradleException('error occurred')

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

Ответ 3

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

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

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

Ответ 4

Другой вариант, если у вас нет желания улавливать исключение позже, - это вызов задачи 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!!

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

Ответ 5

Бросок простого исключения GradleException останавливает сборку script. Это отлично работает для проверка необходимой настройки среды.

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.')
}

Ответ 6

Вот фрагмент кода, который пытается эмулировать, как задача javac 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, возможно, вам придется включить это в журнал ошибок.