Gradle | 테스크 생성 | 테스크 정의

Gradle은 명령에 의해 “테스크(task)“을 수행하는 프로그램이다. 지금까지 gradle compileJava라든지 gradle run와 같은 명령을 사용하였는데, 이들도 모두 “compileJava 테스크 수행”, “run 테스크 수행"이라는 것이다.

테스크 정의 기본

이 테스크는 사용자가 정의할 수 있다. 빌드 파일(build.gradle)에서 테스크의 처리를 기술해두면, 그것을 gradle 명령으로 호출 실행 시킬 수 있다.

테스크는 다음과 같은 형태로 정의한다.

task 테스크명 {
    ...... 수행할 처리 ......
}

테스크는 “task"라는 키워드를 사용하여 정의한다. 이 후에 테스크명을 작성하고, 그 다음에 {} 내에 테스크의 내용을 작성한다. 테스크 선언는 다른 작성법도 있는데, 다음과 같은 작성도 가능하다.

task (테스크명) {...}
task ('테스크명') {...}

이것으로 {} 안에 기술된 처리를 실행하는 작업을 정의할 수 있다. 그럼 실제로 해 보도록 하자.

build.gradle 아래 부분에, 아래와 같이 코드를 추가한다.

task hello {
    println('이것은 hello 테스크 실행한 것이다')
}

그리고 파일을 저장하고, 명령 프롬프트 또는 터미널에서 다음과 같이 실행한다.

$ gradle hello

이것으로 hello 테스크가 실행된다. 실행해 보면, println으로 출력하는 문장 이외에도 다양한 문장이 출력된다.

Starting a Gradle Daemon (subsequent builds will be faster)

> Configure project :
이것은 hello 테스크 실행한 것이다


BUILD SUCCESSFUL in 16s

이는 “quiet 모드"로 테스크를 수행하면 많은 부분이 사라진다. -q 옵션을 지정하고 아래 같이 실행한다.

$ gradle -q hello

이로 표시되는 출력은 상당히 심플하게 될 것이다.

이것은 hello 테스크 실행한 것이다

doFirst와 doLast

테스크는 이렇게 task 후에 {} 부분에 처리를 쓰는 것만으로 만들 수 있다. 사실 보통은 이런 작성법은 많이 쓰지 않는다.

일반적인 테스크의 형태를 정리하면, 대체로 다음과 같은 형태가 된다.

task 테스크명 {

    doFirst {
         ...... 수행할 처리 ......
    }
    
    doLast {
         ...... 수행할 처리 ......
    }
}

태스크 {} 에는 doFirst, doLast 라는 것이 준비된다. 이것은 일종의 클로저이다. 이들은 각각 다음과 같은 기능을 한다.

  • doFirst : 최초에 수행하는 액션이다.
  • doLast : 최후에 수행 하는 액션이다.

테스크는 준비된 “액션"을 순서대로 실행해 나가는 역할을 한다. 액션이라는 것은 구체적으로 수행하는 처리의 “실행 단위” 같은 것이다. 테스크 중에는 여러 가지 액션이 준비되어 있고, 그것이 순차적으로 실행된다.

doFirst과 doLast는 그 액션의 최초, 최후에 실행한다. 즉, “테스크의 기본적인 처리 등이 있을 때는 그 전에 실행하는 것과 후에 실행하는 것"을 이렇게 준비한다.

이는 2개를 세트로 준비할 필요는 없다. 어느 한쪽만으로도 괜찮다.

그러면 실제로 간단한 예를 움직여 보자.

task hello {
    doLast {
        println('이것은 hello 태스크의 doLast이다.')
    }
    doFirst {
        println('이것은 hello 태스크의 doFirst이다.')
    }
}

아래 목록 아래처럼 hello 작업을 다시 시도한다. 그리고 gradle hello를 실행한다. 그러면 다음과 같이 출력된다.

> Task :hello
이것은 hello 태스크의 doFirst이다.
이것은 hello 태스크의 doLast이다.


BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

샘플은 doLast 먼저, doFirst가 후에 쓰여져 있지만, 실행 결과를 보면, 우선 doFirst이 실행된 후에 doLast가 실행되고 있는 것을 알 수 있다.