초보자를 위한 Gradle 안내서 3편: Task

커리큘럼

  1. Build툴?, Gradle은 무엇인가?
  2. Gradle 아키텍쳐
  3. Task
  4. 각자의 프로젝트로

이어서..

전편에서 gradle의 아키텍쳐철학 그리고 Lifecycle(생명주기) 에 대해서 다뤘다.
이번 편에서는 Task에 대해서 자세하게 다뤄보려고 한다.

Task?

앞에서 task는 Gradle의 실행단위라고 하였는데
실행단위를 어떤 작업을 하는 약속된 하나의 객체라고 생각하면 된다.

Gradle의 초기화 > 구성 > 실행 3단계에서
실행 단계에서 실질적으로 우리가 원하는 기능을 하는 것은 task다.
(사실 모든건 task를 실행하기 위한 준비일 뿐이였다..)

처음에 Console에서 gradle init 명령을 통해 프로젝트를 생성 했었을 것이다. init도 사실 하나의 Task이다.

Console에 gradle [task] 명령을 통해 원하는 task를 실행할 수 있다. 기본 제공하는 task 몇 개 더 소개드리겠다. (해보세용~)

  • gradle tasks : 내장 task 리스트를 보여준다.
  • gradle help –task (task명) : task명으로 작성한 task의 도움말 보여준다.
  • gradle build : 빌드한다.
  • gradle clean : 빌드 디렉토리를 삭제한다

예제 다시보기

아래의 예제를 이전글에서 봤을 것이다. 예제를 보면 우리가 직접 Task를 정의 할 수 있다는 걸 알 수 있다.

// build.gradle file
println "Hello"

task testTask {
    println "testTask running"

    doLast {
        println "Task do Last"
    }
    
    doFirst {
        println "Task do First"
    }
}

println "finish Configure"
..\project> gradle testTask

> Configure project :
Hello
testTask running
finish Configure

> Task :testTask
Task do First
Task do Last

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

testTask running구성단계에 출력되고
Task do LastTask do First실행 단계에서 실행이 되었다.
이유를 알아보자면 Gradle의 생명주기 에 있다.

Task의 생성

taskbuild.gradle에 정의되고 구성단계에서 TaskContainer를 이용해 빈으로 생성된다고 했었다.

구성단계에서 testTask running가 출력이 되는 이유는
구성단계에서 testTask를 읽어 Bean 생성때 실행하기 때문이다.

Task의 동작

구성 단계에서 이미 Task를 실행하는데 그럼 실행 단계에서는 뭘하는 것일까? 실행 단계에서 Task의 동작 방식은 일련의 Action순서대로 실행해줄 뿐이다. 즉, Task는 일련의 Action객체로 구성되어 있다고 봐도 된다.

Task 공식문서에 가면 더 다양한 Action을 볼 수 있다.

Task 그래프

어떤 작업을 할때 이 작업을 하기위해서 선행되야 하는 작업이 있을 수 있다
Java에서 컴파일후에 Class 파일을 Target폴더로 옮겨준다던지 등등

Task는 다른 Task에 종속이 될 수 있다 그리고 Task들간에 관계는 DAG(Directed acyclic graph) 로 작동한다

그래프

Task 종속 테스크 지정

    // build.gradle
    task taskX {
        dependsOn 'taskY'
        doFirst {
            println 'taskX doFirst'
        }

        doLast {
            println 'taskX doLast'
        }
    }
    task taskY {
        doLast {
            println 'taskY'
        }
    }
    // 출력
    > gradle taskX //명령! 
    > Task :taskY
    taskY

    > Task :taskX
    taskX doFirst
    taskX doLast

참고

comments powered by Disqus