Gradle | DefaultTask 클래스 사용 | DefaultTask 상속 클래스


Gradle은 표준으로 다양한 테스크가 포함되어 있는데, 이것들은 “DefaultTask"라는 클래스를 상속한 클래스로 준비되어 있다. 이 DefaultTask 상속 클래스는 자신의 테스크을 만들어 커스텀 마이징을 할 수 있다.

우선은 “DefaultTask 상속 클래스"가 어떤 것인지 직접 만들어 본다. 이 클래스는 다음과 같은 형태로 정의된다.

class 클래스 extends DefaultTask {
    ...... 필드 ......

    void 메소드(인수) {
        ...... 처리 ......
    }

    @TaskAction
    void 메소드() {
        ...... 처리 ......
    }
}

클래스는 DefaultTask라는 클래스를 상속하여 만든다. 이 클래스 내에 테스크로 수행할 처리를 메소드로 제공한다. 이 메소드에는 @TaskAction 어노테이션을 붙여 둔다. 그러면 테스크로 실행되었을 때, 이 메소드가 호출된다.

테스크로 사용하는 각종의 값은 필드로 사용할 수 있어야 한다. 이것은 그대로 이용해도 되지만, 외부에서 사용하는 경우는 private 필드로 설정하여 접근을 위한 메소드를 따로 제공하는 것이 스마트하다.

다음에 간단한 클래스의 예제를 올려 두었다.

class Calc extends DefaultTask {
    private int num
    private String op
 
    void num(p1){
        num = p1
    }
 
    void op(p1){
        op = p1
    }
 
    @TaskAction 
    void calc() {
        switch(op) {
        case 'total':
            int total = 0
            for(def i in 1..num) {
                total += i
            }
            println("total: ${total}")
        break
 
        case 'count':
            for(def i in 1..num) {
                println("NO, ${i}")
            }
        break
 
        default:
            println('not found operator...')
        }
    }
}

Calc 클래스에는 calc 라는 테스크 액션을 준비하고 있다. 여기에서 num와 op의 값에 따라 총의 계산과 수치 계산을 하고 있다.

Calc 클래스를 지정한 테스크

그럼, DefaultTask 상속 클래스를 이용하는 테스크는 어떻게 작성할 수 있을까? 그 작성법은 아래와 같다.

task 테스크(type : 클래스) {
    ...... 수행할 처리 ......
}

테스크의 ()에는 인수로 ’type’ 값을 준비하고, 이 type에서 사용하는 클래스를 지정하다.

실제로 수행하는 처리에는 사용하는 클래스에 필드로 준비되어 있는 변수에 값을 할당하는 처리를 준비해 둔다. 이렇게 하면, 클래스의 각 필드의 값을 변경하여 테스크 메소드를 실행할 수 있다.

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

task total(type:Calc) {
    group 'devkuma'
    description 'Task for calculating total.'
    num 100
    op 'total'
}
 
task count(type:Calc) {
    group 'devkuma'
    description 'Task for count number.'
    num 10
    op 'count'
}

여기에서는 앞 전에 Calc 클래스를 type에 지정한 total, count라는 두 가지 테스크를 만들었다. gradle total라고 실행하면 100까지의 합계가 계산된다.

$ gradle total

> Task :total
total: 5050


BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

“gradle count"라고 실행하면 1 ~ 10까지의 숫자를 순서대로 출력한다.

$ gradle count

> Task :count
NO, 1
NO, 2
NO, 3
NO, 4
NO, 5
NO, 6
NO, 7
NO, 8
NO, 9
NO, 10


BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

여기에서는 테스크의 인수로 (type:Calc)을 지정하고 있다. 그러면 Calc 클래스의 테스크를 수행하는 테스크으로 정의될 수 있다. 여기에는 다음과 같은 문장이 작성되어 있다.

group 그룹명
description 설명
num 정수
op 조작의 유형

이들은 모두 상속의 Calc 클래스에 있는 메소드를 호출하는 것이다. group과 description은 DefaultTask 클래스에 있는 것으로, 각 그룹명과 설명 텍스트를 설정한다.

그리고 Calc 클래스에 준비되어 있는 num와 op으로 계산의 정수 값와 작업의 유형을 지정하고 있다.

이런 식으로 task로 정의된 가운데, type 지정한 클래스의 메서드를 호출하여 필요한 설정을 한다. 그러면, 그 설정이 된 후에 태스크 액션이 수행된다.