确保 Gradle 任务始终运行,无论依赖项的结果如何
Ensuring Gradle Task always runs regardless of results from dependencies
即使构建任务抛出可怕的错误,我如何确保下游 "validate" 任务执行?
我希望所有这些可能的流程成为可能:
- 构建 -> 测试 -> 验证
- 构建(错误)-> 验证
- 构建 -> 测试(错误) -> 验证
我发现 GradleException 和 TaskExecutionException 导致完全停止,没有进一步的任务执行,StopActionException 不会阻止测试执行。
示例代码:
task build(){
doFirst() {
println "building..."
throw new GradleException("Gradle exc")
}
}
task test(){
mustRunAfter 'build'
doFirst() {
println "testing..."
}
}
task validate() {
doFirst() {
println "validating..."
}
}
task buildPlan(dependsOn:[build,test]) {}
buildPlan.finalizedBy(validate)
在这种情况下,'build' 和 'test' 都需要 finalizedBy
'validate'。不幸的是,如果 'build' 或 'test' 失败,'buildPlan' 任务将不会执行,因此 'validate' 任务永远不会 运行.
有人知道这是否会省去构建步骤吗?
如果我使用一个任务,它有自己的 try catch 并在每个任务上调用 execute,那么它会按我想要的方式工作。
task build(){
doFirst() {
println "building..."
throw new GradleException("Gradle exc")
}
}
task test(){
mustRunAfter 'build'
doFirst() {
println "testing..."
}
}
task validate() {
doFirst() {
println "validating..."
}
}
// Validate Called Reliably
task buildWithCatch {
doFirst {
try {
build.execute()
test.execute()
}
finally {
validate.execute()
}
}
}
// Validate Never Called
task buildPlan(dependsOn:[build,test]) {}
buildPlan.finalizedBy(validate)
即使构建任务抛出可怕的错误,我如何确保下游 "validate" 任务执行?
我希望所有这些可能的流程成为可能:
- 构建 -> 测试 -> 验证
- 构建(错误)-> 验证
- 构建 -> 测试(错误) -> 验证
我发现 GradleException 和 TaskExecutionException 导致完全停止,没有进一步的任务执行,StopActionException 不会阻止测试执行。
示例代码:
task build(){
doFirst() {
println "building..."
throw new GradleException("Gradle exc")
}
}
task test(){
mustRunAfter 'build'
doFirst() {
println "testing..."
}
}
task validate() {
doFirst() {
println "validating..."
}
}
task buildPlan(dependsOn:[build,test]) {}
buildPlan.finalizedBy(validate)
在这种情况下,'build' 和 'test' 都需要 finalizedBy
'validate'。不幸的是,如果 'build' 或 'test' 失败,'buildPlan' 任务将不会执行,因此 'validate' 任务永远不会 运行.
有人知道这是否会省去构建步骤吗?
如果我使用一个任务,它有自己的 try catch 并在每个任务上调用 execute,那么它会按我想要的方式工作。
task build(){
doFirst() {
println "building..."
throw new GradleException("Gradle exc")
}
}
task test(){
mustRunAfter 'build'
doFirst() {
println "testing..."
}
}
task validate() {
doFirst() {
println "validating..."
}
}
// Validate Called Reliably
task buildWithCatch {
doFirst {
try {
build.execute()
test.execute()
}
finally {
validate.execute()
}
}
}
// Validate Never Called
task buildPlan(dependsOn:[build,test]) {}
buildPlan.finalizedBy(validate)