問題を検出した後、Gradleビルドを停止するにはどうすればよいですか?アサートを使用したり、例外をスローしたり、System.exitを実行したり(悪い考え)、Gradleで専用の関数を使用したりすることができます(しかし、見つけることができませんでした)。 Gradleに最適な方法は何ですか(およびその理由)。
私は通常 org.gradle.api
package から関連する例外をスローします。たとえば、誰かが無効なものを入力した場合は InvalidUserDataException
、または GradleScriptException
より一般的なエラー。
現在のタスクまたはアクションを停止して、次のタスクまたはアクションに進む場合は、 StopActionException
をスローすることもできます
ビルドを停止する場合は、次をスローします。
throw new GradleException('error occurred')
または、上記の例外のサブクラスをスローします。一部のサブクラス例外は、実際には現在のタスクのみを失敗させ、ビルドを続行します。
現在、専用の方法はありませんが、追加する議論があります。
Gradleビルドを停止する推奨方法は、例外をスローすることです。 Groovyには例外がチェックされておらず、Gradleはデフォルトで例外タイプを出力しないため、どの例外がスローされるかはそれほど重要ではありません。ビルドスクリプトでは、GradleExceptionがよく使用されますが、Groovyのアサーションも妥当なようです(状況と対象ユーザーによって異なります)。重要なのは、明確なメッセージを提供することです。原因(利用可能な場合)を追加すると、デバッグに役立ちます(--stacktrace
)。
Gradleは、現在のタスク/タスクアクションを停止するがビルドを継続するための専用の例外タイプStopExecutionException
/StopActionException
を提供します。
後で例外をキャッチできるようにしたくない場合の別のオプションは、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!!
おそらくあなたはcanこれをキャッチします(おそらく、antのBuildExceptionをスローしますか?) 。不合格。 tim_yatesが示唆したように、標準のgradle例外をスローすることで、キャッチする例外を簡単に確認できるようにします。
単純な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.')
}
以下は、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にも書き込む場合、エラーログに含める必要があります。