Gradle의 Task 이해하기

1 Gradle의 Task 이해

  • 1.1 Task 정의 및 설정
  • 1.2 Task 실행 방법
  • 1.3 Task 의존성과 실행 순서
  • 1.4 Task 유형
  • 1.5 Task와 Gradle 라이프사이클의 결합
  • 1.6 Task 실전 활용

1.1 Task 정의 및 설정

1.1.1 모든 task 보기

./gradlew tasks
출력:
> Task :tasks 

------------------------------------------------------------
모든 루트 프로젝트에서 실행 가능한 작업들
------------------------------------------------------------

Android 작업들
-------------
androidDependencies - 프로젝트의 Android 의존성을 표시합니다.
signingReport - 각 variant에 대한 서명 정보를 표시합니다.
sourceSets - 이 프로젝트에서 정의된 모든 소스 세트를 출력합니다.

빌드 작업들
-----------
assemble - 모든 애플리케이션과 보조 패키지의 모든 변형을 조립합니다.

.....

1.1.2 새로운 task 생성

Project의 task() 메소드 또는 TaskContainer를 사용하여 task를 생성할 수 있습니다. 두 가지 방법 모두 동일한 결과를 제공하며, TaskContainer는 project 내의 task 관리를 편리하게 해줍니다.

// 첫 번째 방법: project의 task() 메소드를 사용하여 생성
task 새작업 {
    println '이것은 새작업입니다'
}

// 두 번째 방법: TaskContainer를 사용하여 생성
this.tasks.create(name: '새작업2') {
    println '이것은 새작업2입니다'
}

1.1.3 task 설정

두 가지 방법으로 task를 설정할 수 있습니다:

  1. 생성 시점에 설정
  2. 클로저 내에서 설정
// 첫 번째 방법: 생성 시점에 group과 description 설정
task 새작업(group: '기본', description: '설명 예제') {
    println '이것은 새작업입니다'
}

// 두 번째 방법: 클로저 내에서 설정
this.tasks.create(name: '새작업2') {
    setGroup('기본')
    setDescription('설명 예제')
    println '이것은 새작업2입니다'
}

1.1.4 task 실행 순서

task 새작업(group: '기본', description: '설명 예제') {
    println '이것은 새작업입니다'

    doFirst {
        println '첫번째로 실행'  // 작업 실행 시 가장 먼저 실행됩니다
    }

    doLast {
        println '마지막으로 실행'   // 작업 실행 시 가장 마지막에 실행됩니다
    }
}

doFirstdoLast 내부의 코드는 해당 task가 실행될 때만 실행되며, 직접 task 클로저 안에 작성된 코드는 설정 단계에서 이미 실행됩니다.

1.1.5 빌드 시간 계산

def 시작시간
def 종료시간

project.afterEvaluate { 프로젝트 ->
    def preBuildTask = 프로젝트.tasks.getByName('preBuild')
    preBuildTask.doFirst {
        시작시간 = System.currentTimeMillis()
        println '시작 시간: ' + 시작시간
    }

    def buildTask = 프로젝트.tasks.getByName('build')
    buildTask.doLast {
        종료시간 = System.currentTimeMillis()
        println '빌드 시간: ' + (종료시간 - 시작시간)
    }
}

1.1.6 task 의존성

task 간 의존성을 지정할 수 있습니다. 예를 들어 taskA가 taskB에 의존하는 경우, taskA를 실행하면 taskB가 먼저 실행됩니다.

task 작업B {
    doLast {
        println '나는 작업B입니다'
    }
}

task 작업A(dependsOn: 작업B) {
    doLast {
        println '나는 작업A입니다'
    }
}

// 실행
./gradlew 작업A

출력:
> Task :app:작업B 
나는 작업B입니다

> Task :app:작업A 
나는 작업A입니다

또는 다음과 같이 나중에 의존성을 추가할 수도 있습니다:

task 작업B {
    doLast {
        println '나는 작업B입니다'
    }
}

task 작업A {
    doLast {
        println '나는 작업A입니다'
    }
}

작업A.dependsOn 작업B

하나의 task가 여러 task에 의존할 수 있으며, 이를 위해 다음과 같이 작성합니다:

작업A.dependsOn '작업B', '작업C'

1.1.7 사용자 정의 task를 빌드 과정에 연결

빌드 후 특정 task를 실행하고 싶다면 다음과 같이 작성합니다:

afterEvaluate { 프로젝트 ->
    def buildTask = 프로젝트.tasks.findByName('build')
    if (buildTask == null) {
        throw new GradleException('빌드 태스크를 찾을 수 없습니다.')
    }

    buildTask.doLast {
        사용자정의작업.execute()
    }
}

SourceSets 클래스의 역할

SourceSets 클래스는 소스 파일, 리소스 파일, 라이브러리 파일 등의 위치를 정의합니다. 기본적으로 Gradle은 약속된 구성을 사용하지만, 필요에 따라 이를 수정할 수 있습니다:

sourceSets {
    main {
        jniLibs.srcDirs = ['libs'] // so 파일 위치 변경
    }
}

sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res-ad', 'src/main/res-player']
    }
}

태그: Gradle Task java Groovy Android

6월 13일 16:49에 게시됨