Gradleビルドを停止するための推奨される方法


162

問題を検出した後、Gradleビルドを停止するにはどうすればよいですか?アサートを使用したり、例外をスローしたり、System.exit(悪い考え)を実行したり、Gradleで専用の関数を使用したりできます(ただし、見つかりませんでした)。Gradleの最良の方法は何ですか(そしてその理由は?)。

回答:


117

通常、org.gradle.apiパッケージから関連する例外をスローします。たとえばInvalidUserDataException、誰かが無効なものを入力した場合やGradleScriptException、より一般的なエラーが発生した場合などです。

現在のタスクまたはアクションを停止して、次に進む場合は、 StopActionException


5
タスクが正常に実行されない場合は、TaskExecutionExceptionを使用することもできます。(gradle 1.11のドキュメントによると、これは真実です。いつ導入されたかはわかりません。)
Josh Gagnon 14

ここに素晴らしい構文オプションはありますか?kotlinの前提条件構文を検討してください。require(something != whatever) { "No good!" }より冗長でtype-eeとは対照的ですif(something != whatever){ throw new GradleException("No good!") }
Groostav

恐ろしいことGradleScriptExceptionは、それが原因のために2番目のパラメータを必要とするということです。
トレカズ2017年

...もちろん、これは「例外によるプログラミング」であると言うことは避けていますか?!私は、従来は、書かれたそのようにコード化されてきたし、維持するためにホラーです...で古風日哲学は、周りのmakeことですrules(タスク-S)が成功したか失敗しました。私は一度試しましたreturn false-Gradleはそれを無視して実行を続けました。
意志

87

ビルドを中止したい場合は、以下をスローします。

throw new GradleException('error occurred')

または、上記の例外のサブクラスをスローします。一部のサブクラスの例外は、実際には現在のタスクを失敗させるだけで、ビルドを続行します。


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!!

おそらくこれキャッチできます(おそらくantのBuildExceptionをスローしますか?)。しかし、それが目標である場合は、ant.failを使用しません。tim_yatesが提案するように、標準のGradle例外をスローすることで、どの例外をキャッチするかを簡単に確認できるようにします。


設定方法を教えてください。あれを呼べ?
powder366

1
ant.fail( 'message of your choice')を呼び出すだけで、セットアップは不要です
Gus

2
この出力は(Gradle 3.4.1)を使用した場合と同じように見えますthrow new GradleException("The sky is falling!!")
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と、出力はありません。他の値を指定すると、standardOutputが出力され、ビルドが停止します。

注:コマンドがerrorOutputにも書き込む場合は、それをエラーログに含める必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.