Image
CI\CD/Groovy Gradle

[Gradle] Custom Task 만들고 Task Chaining 하기

build.gradle의 task

build.gradle의 task는 Project 객체의 메서드이다. task는 task이름과 람다식을 인자로 받으며, 이 task는 gradle [task 이름]을 통해 수행 가능해진다.

 

 

build.gradle에 커스텀 task 만들기

build.gradle에는 메서드와 같이 커스텀 task를 만들 수도 있다. 커스텀 task는 다음의 문법으로 만들어진다. task 자체가 메서드이며, task의 인자로 task 이름이 넘어간다.

task [task 이름] {
   [task에서 수행할 람다식]
}

 

Groovy는 다양한 방식으로 task를 만들 수 있다. 이는 Groovy의 특수한 문법 때문인데, String에서 ""을 생략하고도 쓸 수 있고 메서드를 수행하기 위해 [메서드명] [인자] 와 같이 쓰는 방식은 물론 [메서드명]([인자]) 와 같이 쓸 수도 있어 그렇다. 개인적으로 Groovy를 좋아하지 않는 이유가 너무 다양한 방식으로 메서드를 실행할 수 있게 때문이다.

 

예를 들어 blog이름을 프린트하는 printBlogName task를 다음과 같이 여러 방식으로 생성할 수 있다.

project.task printBlogName {
   println project.blogName
}

task printBlogName {
   println project.blogName
}

task("printBlogName"){
   println project.blogName
}

task(printBlogName){
   println project.blogName
}

 

 

build.gradle의 task의 동작 시기

Gradle은 Initialization, Configuration, Execution 과정을 순서대로 수행해서 작업을 수행한다. 만약 이것에 대해 잘 모른다면 다음글을 살펴보길 바란다.

 

Task는 기본적으로 Configuration 시 동작한다. 하지만,람다식에 추가적으로 doFirst { }, doLast { } 메서드 블록을 넣어 Execution 시 동작하도록 수정할 수 있다.

task("gradleCustomTask"){
    println("Do on Configuration")

    doFirst {
        println("Do on First Execution")
    }
    
    doLast {
        println("Do on Last Execution")    
    }
}

 

위의 task를 gradle sampleTask 를 이용해 수행하면 다음과 같이 결과가 나온다. Configure project(Configuration 단계)에서 Task on Configuration이 수행되고, Task(Execution 단계)에서 Task on Execution이 수행되는 것을 확인할 수 있다. 

$ gradle gradleCustomTask

> Configure project :app
Do on Configuration

> Task :app:sampleTask
Do on First Execution

> Task :app:sampleTask
Do on Last Execution

 

 

task chaining하기

Gradle Task를 Chaining하기 위해서는 task의 프로퍼티에 dependsOn과 finalizedBy를 추가하면 된다. dependsOn은 특정 Task 와 같이 실행되도록 하며, finalizedBy는 특정 Task이후에 수행되도록 만드는 Task객체의 프로퍼티이다.

 

예를 들어 다음과 같이 수행할 수 있다.

task("gradleCustomTask") {
    doFirst { println("Do on First Execution") }
    doLast { println("Do on Last Execution") }
}

task("cleanFiles"){
    doLast {
        println("cleaned")
    }
}

task("configureProperties"){
    project.ext.blogName = "Kotlin World"
    println("configure finished")
}

gradleCustomTask.dependsOn configureProperties
gradleCustomTask.finalizedBy cleanFiles

 

위에서 gradleCustomTask 를 실행하면 다음과 같은 결과가 나온다.

$ gradle gradleCustomTask

> Configure project :
Do on Configuration
configure finished

> Task :gradleCustomTask
Do on First Execution
Do on Last Execution

> Task :cleanFiles
cleaned

 

 

default task 설정하기

기본적으로 실행되는 task를 설정하기 위해서는 project 오브젝트의 defaultTasks 프로퍼티를 설정하면 된다.

project.defaultTasks "[Default Task명]"

 

예를 들어 바로 위 예제의 마지막줄에 project.defaultTasks "gradleCustomTask" 을 추가하면 gradleCustomTask가 기본 Task가 된다.

task("gradleCustomTask") {
    doFirst { println("Do on First Execution") }
    doLast { println("Do on Last Execution") }
}

task("cleanFiles"){
    doLast {
        println("cleaned")
    }
}

task("configureProperties"){
    project.ext.blogName = "Kotlin World"
    println("configure finished")
}

gradleCustomTask.dependsOn configureProperties
gradleCustomTask.finalizedBy cleanFiles
project.defaultTasks "gradleCustomTask"

 

위와 같이 설정되면 gradle만으로 Task가 실행된다.

$ gradle

> Configure project :
configure finished

> Task :gradleCustomTask
Do on First Execution
Do on Last Execution

> Task :cleanFiles
cleaned

 

반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com