gradle task를 작성하다보면 특정 task 이 후 다른 task를 실행시키거나

task를 실행하기 전에 특정 task 실행시킬 필요가 있다.

예를들면, ‘bootWar를 실행하기전에 반드시 test를 수행한다. test가 성공해야만 bootWar를 수행한다.’ 등이 있을 듯 하다.

이런 task의 관계를 finalizedBy, dependsOn 을 이용해 제어 할 수 있다.

(gradle 6.9(groovy) 버전 기준입니다.)

finalizedBy

task 이 후 실행시킬 task를 설정해준다. 단, 해당 task의 성공/실패 여부와 상관없이 실행시킨다.

TaskA.finalizedBy('TaskB') 라고 쓰면 TaskA가 종료된 후 TaskB를 실행시킨다는 의미이다.

TaskA.finalizedBy('TaskB') 라고 task 밖에 정의해도 되고 task 내부에 정의 할 수도 있다.

다음과 같은 task 가 있을 때 TaskA가 실행되면 TaskB도 자동으로 실행이 된다.


task TaskA {
    doLast{
        println 'TaskA!'
    }
    finalizedBy 'TaskB'
}

task TaskB {
    doLast{
        println 'TaskB!'
    }
}

TaskA가 정상적으로 실행되면서 TaskB도 자동으로 실행이 된다.

> Task :TaskA
TaskA!

> Task :TaskB
TaskB!

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed

TaskA가 실패를 해도 TaskB는 실행이 된다.

> Task :TaskA FAILED
TaskA!

> Task :TaskB
TaskB!

...

BUILD FAILED in 2s
2 actionable tasks: 2 executed


dependsOn

task가 실행되기 전에 수행 될 task를 설정해준다. 이전 task가 성공해야 자신이 실행된다.

TaskA.dependsOn('TaskB') 라고 쓰면 TaskB를 먼저 실행시키고 성공 하면 TaskA를 실행시킨다는 의미이다.

finalizedBy처럼 TaskA.dependsOn('TaskB')로 task 밖에 정의해도 되고 task 내부에 정의 할 수도 있다.


task TaskA {
    doLast{
        println 'TaskA!'
    }
    dependsOn 'TaskB'
}

task TaskB {
    doLast{
        println 'TaskB!'
    }
}

TaskB가 먼저 실행되고 정상적으로 실행면 TaskA가 실행이 된다.

> Task :TaskB
TaskB!

> Task :TaskA
TaskA!

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed

finalizedBy와는 다르게 이전 task가 실행이 되면 자기자신은 실행되지 않는다.

> Task :TaskB FAILED
TaskB!

FAILURE: Build failed with an exception.

...

BUILD FAILED in 2s
1 actionable task: 1 executed

선행작업인 TaskB가 실패하면서 TaskA는 실행되지 않았다.

1개의 task가 아닌 여러개의 task를 dependsOn으로 설정 할 수도 있다.

task TaskA {
    doLast{
        println 'TaskA!'
    }
    dependsOn(provider{
        tasks.findAll { execTask -> execTask.name.startsWith("TaskB")} // Task명 조건
    })
}

2개를 다 사용하면?

2개를 다 사용 할 수도 있다.

TaskA.finalizedBy('TaskB') , TaskB.dependsOn('TaskA')

둘 다 똑같이 TaskA -> TaskB 순으로 설정했으니 TaskA 다음 TaskB가 실행이 된다.

만약 TaskA가 실패한다면??

dependsOn에 의해서 TaskB는 실행되지 않는다.


참고