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를 설정할 수 있습니다:
- 생성 시점에 설정
- 클로저 내에서 설정
// 첫 번째 방법: 생성 시점에 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 '마지막으로 실행' // 작업 실행 시 가장 마지막에 실행됩니다
}
}
doFirst와 doLast 내부의 코드는 해당 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']
}
}