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


162

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

Відповіді:


117

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

Якщо ви хочете зупинити поточне завдання чи дію та перейти до наступного, ви також можете кинути a StopActionException


5
Ви також можете використовувати TaskExecutionException, якщо завдання не виконується успішно. (Це правда згідно зі ступенем 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')

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


28

Наразі не існує виділеного методу, хоча вже було обговорено питання щодо його додавання.

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

Gradle надає виділені типи винятків StopExecutionException/ StopActionExceptionдля зупинки поточного завдання / завдання, але продовження складання.


19

Іншим варіантом, якщо ви не маєте бажання мати можливість пізніше зловити виняток, - це зателефонувати до завдання, яка не спрацює. На мою думку це читати трохи простіше, і ви можете дати приємне повідомлення користувачеві без використання --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.


Як це встановити? Назви це?
порошок366

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

5

Ось фрагмент коду, який намагається наслідувати, як завдання 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, можливо, вам знадобиться включити це в журнал помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.