Gradle | 테스크 생성 | 다른 테스크 호출 및 종속


다른 테스크 호출

테스크에서 다른 테스크를 호출해야 하는 경우도 있다. 예를 들어 아래와 같은 테스크가 있다고 해보자.

task a {……}
task b {……}

a와 b라는 테스크가 있을 때, 테스크 a에서 테스크 b를 호출하려면 어떻게 해야 하는가? Java적으로 생각한다면 아래와 같이 호출하면 될거라 생각할 것이다.

b()

하지만 이렇게는 작동을 하지 않는다. 그럼 어떻게 해야 하는가? 그것은 “tasks"에 있는 작업 객체 안의 메소드를 호출하여 수행한다.

작업하는 것은 모든 tasks라고 객체에 정리하고 있다. 이것은 예를 들어 a, b라는 테스크가 있다면 tasks.a과 tasks.b로 지정할 수 있다. 이 테스크 객체 안에 있는 “execute"라는 메소드를 호출하여 테스크를 수행할 수 있다.

tasks.a.execute()
tasks.b.execute()

이런 식으로 실행하여 테스크 a, b를 호출한다.

간단한 사용 예를 아래에 올려 두었다.

task hello  {
    doFirst {
        println("*** start:hello task ***")
        tasks.aaa.execute()
     }
    doLast {
        tasks.bbb.execute()
        println("*** end:hello task ***")
    }
}
 
task aaa {
    doLast {
        println("<< This is A task! >>")
    }
}
 
task bbb {
    doLast {
        println("<< I'm task B!! >>")
    }
}

gradle hello와 같이 hello 태스크를 실행해 보면, 아래와 같이 출력이 된다.

> Task :hello
*** start:hello task ***
<< This is A task! >>
<< I'm task B!! >>
*** end:hello task ***

여기에서는 hello의 doFirst 안에서 aaa, doLast에서 bbb를 호출하고 있다. 출력되는 텍스트가 호출되는 순서를 잘 확인한다.

종속 테스크 지정

어떤 테스크를 수행할 때, 다른 작업 수행이 필수적인 경우도 있다. 이러한 경우에는 “dependsOn ‘라는 기능을 사용할 수 있다. 이는 다음과 같이 작성한다.

task 테스크명 (dependsOn : '테스크') {
    ...... 중략 ......
}

또는 다음과 같은 작성도 가능한다.

task 테스크명 {
    dependsOn : '테스크'
    ...... 중략 ......
}

이와 같이 기술해 두면 작업이 호출될 때, 먼저 dependsOn에 지정된 작업을 수행하고 그것이 끝난 후에 테스크의 본 처리를 수행한다.

여러 테스크를 지정해야 하는 경우는 테스크명을 배열로 지정한다. [ ‘a’, ‘b’, ‘c’]와 같은 식이다. 이 경우 최초에 작성한 테스크부터 실행된다.

아래 목록 필드에 사용할 예제를 올려 두었다.

task hello(dependsOn:['aaa', 'bbb'])  {
    doFirst {
        println("*** start:hello task ***")
    }
    doLast {
        println("*** end:hello task ***")
    }
}
 
task aaa {
    doLast {
        println("<< This is A task! >>")
    }
}
 
task bbb {
    doLast {
        println("<< I'm task B!! >>")
    }
}

이를 “gradle hello"로 실행한다. 다음과 같이 출력이 된다.

> Task :aaa
<< This is A task! >>

> Task :bbb
<< I'm task B!! >>

> Task :hello
*** start:hello task ***
*** end:hello task ***

최초에 aaa 테스크, bbb 테스크이 실행되면, 이후에 hello 태스크가 호출되었는지 알 수 있다. dependsOn에 의해, aaa, bbb가 종속 테스크가 되는 테스크가 실행된 후가 아니면 hello가 실행되지 않게 된다.