Как я могу остановить создание Gradle после обнаружения проблемы? Я могу использовать утверждение, исключение, сделать System.exit(плохая идея) или использовать выделенную функцию в Gradle (но я не смог найти ее). Каков наилучший способ для Gradle (и почему?).
Рекомендуемый способ остановки сборки Gradle
Ответ 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, возможно, вам придется включить это в журнал ошибок.