9.8 KiB
태스크(Task)
Gradle은 태스크(Task) 기반 빌드 시스템으로, 프로젝트를 구성하고 자동화할 수 있는 강력한 기능을 제공한다.
태스크(Task)는 Gradle에서 실행 가능한 단위이며, 프로젝트를 빌드하는 데 필요한 작업(예: 컴파일, 테스트, 패키징 등)을 정의한다. Gradle은 기본적으로 여러 태스크를 제공하지만, 사용자가 직접 정의하여 실행할 수도 있다.
태스크 목록 확인
./gradlew tasks
기본적인 태스크 정의와 실행
Gradle에서는 build.gradle.kts 파일에서 태스크를 정의할 수 있다.
간단한 태스크 정의
Kotlin DSL을 사용하여 기본적인 태스크를 정의하는 방법을 살펴보자.
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}
위 태스크는 hello라는 이름으로 등록되며, 실행하면 "Hello, Gradle!"이 출력된다.
tasks.register vs tasks.create
태스크를 등록하는 방법에는 tasks.register와 tasks.create가 있다.
// 지연 평가 방식 (Lazy Evaluation)
val lazyTask = tasks.register("lazyTask") {
doLast {
println("이 태스크는 실행 시점에서 평가됩니다.")
}
}
// 즉시 평가 방식 (Eager Evaluation)
val eagerTask = tasks.create("eagerTask") {
doLast {
println("이 태스크는 빌드 스크립트가 로드될 때 즉시 평가됩니다.")
}
}
tasks.register는 지연 평가(Lazy Evaluation) 방식으로, 태스크가 실행될 때까지 구성이 지연된다.tasks.create는 즉시 평가(Eager Evaluation) 방식으로, 스크립트가 로드될 때 바로 실행된다.
일반적으로 성능상의 이유로 tasks.register를 사용하는 것이 권장된다.
태스크 실행 방법
터미널에서 다음 명령어를 실행하면 정의한 태스크를 실행할 수 있다.
./gradlew hello
여러 액션을 포함한 태스크
태스크 내에서 여러 개의 액션을 정의할 수도 있다.
tasks.register("greet") {
doFirst {
println("처음 실행되는 액션")
}
doLast {
println("마지막으로 실행되는 액션")
}
}
이 태스크를 실행하면 "처음 실행되는 액션"이 먼저 출력되고, "마지막으로 실행되는 액션"이 나중에 출력된다.
태스크 종속성(Task Dependencies)
특정 태스크가 다른 태스크 이후에 실행되도록 설정할 수 있다.
tasks.register("taskA") {
doLast {
println("Task A 실행")
}
}
tasks.register("taskB") {
dependsOn("taskA") // taskA가 먼저 실행됨
doLast {
println("Task B 실행")
}
}
위 예제에서 taskB를 실행하면 taskA가 먼저 실행된 후 taskB가 실행된다.
사용자 정의 확장 프로퍼티
Gradle에서는 사용자 정의 확장 프로퍼티를 추가할 수 있다.
val greeting: String by project
tasks.register("customGreet") {
doLast {
println("Greeting message: $greeting")
}
}
그리고 gradle.properties 파일에 값을 추가하면 실행 시 사용할 수 있다.
greeting=Hello, Kotlin DSL!
빝트인 태스크
tasks.register<Copy>("copyTask") {
from("source")
into("target")
include("*.war")
}
- Copy - Copy is useful to copy files around.
- Delete - Delete is useful to delete files and directories.
- Exec - Exec is useful to execute arbitrary O/S commands.
- Zip - Zip is useful to bundle files.
Gradle 빌트인 태스크 정리
Gradle은 다양한 **빌트인 태스크(Built-in Task)**를 제공하며, 프로젝트 빌드 및 관리를 효율적으로 수행할 수 있도록 돕는다.
특히 Copy, Zip 등의 태스크는 파일을 조작하고 패키징하는 데 유용하다.
아래에서 주요 빌트인 태스크를 정리하고, 사용 예시를 함께 제공한다.
1. 주요 빌트인 태스크 목록
| 태스크(Task) | 설명 |
|---|---|
Copy |
파일 및 디렉터리를 복사 |
Sync |
Copy와 유사하지만, 대상 디렉터리를 동기화 |
Zip |
ZIP 압축 파일 생성 |
Tar |
TAR 압축 파일 생성 (.tar, .tar.gz 등) |
Delete |
파일 및 디렉터리 삭제 |
Exec |
외부 프로세스 실행 |
JavaExec |
Java 애플리케이션 실행 |
Task |
기본적인 사용자 정의 태스크 생성 |
DefaultTask |
기본적으로 실행할 수 있는 커스텀 태스크 생성 |
Wrapper |
Gradle Wrapper 스크립트 생성 |
Test |
테스트 실행 |
Jar |
JAR 파일 생성 |
War |
WAR(Web Application Archive) 파일 생성 |
Ear |
EAR(Enterprise Application Archive) 파일 생성 |
GenerateBuildConfig |
Android 프로젝트에서 BuildConfig 클래스 생성 |
CompileJava |
Java 코드 컴파일 |
ProcessResources |
리소스 처리 |
Assemble |
프로젝트 빌드 결과물을 패키징 |
Check |
프로젝트 검증(테스트 포함) |
Build |
전체 빌드 수행 |
Clean |
빌드 결과물 삭제 |
Dependencies |
의존성 정보 출력 |
2. 파일 조작 관련 태스크
(1) Copy 태스크 - 파일 및 디렉터리 복사
Copy 태스크는 특정 디렉터리나 파일을 다른 위치로 복사하는 데 사용된다.
사용 예제:
tasks.register<Copy>("copyFiles") {
from("src/main/resources") // 복사할 원본 디렉터리
into("build/copied-resources") // 복사 대상 디렉터리
}
고급 예제 (파일 필터링 적용):
tasks.register<Copy>("copySpecificFiles") {
from("src/assets")
into("build/assets")
include("**/*.png") // PNG 파일만 복사
exclude("temp/**") // temp 폴더 제외
}
(2) Sync 태스크 - Copy와 유사하지만 대상 디렉터리를 동기화
Sync 태스크는 Copy와 유사하지만, 대상 디렉터리에 없는 파일을 삭제하여 동기화하는 점이 다르다.
사용 예제:
tasks.register<Sync>("syncFiles") {
from("src/main/resources")
into("build/synced-resources")
}
(3) Delete 태스크 - 파일 및 디렉터리 삭제
Delete 태스크는 특정 파일이나 디렉터리를 삭제하는 데 사용된다.
사용 예제:
tasks.register<Delete>("cleanOutput") {
delete("build/output")
}
3. 압축 관련 태스크
(1) Zip 태스크 - ZIP 압축 파일 생성
Zip 태스크를 사용하면 특정 파일 및 디렉터리를 .zip 파일로 압축할 수 있다.
사용 예제:
tasks.register<Zip>("zipFiles") {
from("src/main/resources")
archiveFileName.set("resources.zip") // 생성할 ZIP 파일 이름
destinationDirectory.set(file("build/distributions")) // ZIP 저장 위치
}
고급 예제 (파일 선택 및 압축 내 경로 설정):
tasks.register<Zip>("zipSelectedFiles") {
from("src/assets") {
include("**/*.jpg") // 특정 파일만 포함
}
archiveFileName.set("images.zip")
destinationDirectory.set(file("build/zipped"))
}
(2) Tar 태스크 - TAR 압축 파일 생성
TAR 파일(.tar, .tar.gz, .tar.bz2)을 생성하는 데 사용된다.
사용 예제:
tasks.register<Tar>("tarFiles") {
from("src/main/resources")
archiveFileName.set("resources.tar")
compression = Compression.GZIP // .tar.gz 압축 설정
destinationDirectory.set(file("build/distributions"))
}
4. 실행 관련 태스크
(1) Exec 태스크 - 외부 프로세스 실행
Exec 태스크는 쉘 명령어 또는 외부 프로세스를 실행할 때 사용된다.
사용 예제:
tasks.register<Exec>("runShellCommand") {
commandLine("ls", "-l") // 리눅스/macOS에서 파일 목록 출력
}
Windows에서 사용 예제:
tasks.register<Exec>("runBatchScript") {
commandLine("cmd", "/c", "dir") // Windows에서 디렉터리 목록 출력
}
(2) JavaExec 태스크 - Java 애플리케이션 실행
Java 실행 가능한 프로그램을 실행할 때 사용한다.
사용 예제:
tasks.register<JavaExec>("runJavaApp") {
mainClass.set("com.example.Main") // 실행할 클래스
classpath = sourceSets.main.get().runtimeClasspath
}
5. 빌드 및 테스트 관련 태스크
(1) CompileJava 태스크 - Java 코드 컴파일
Java 코드를 컴파일하는 데 사용된다.
사용 예제:
tasks.named<JavaCompile>("compileJava") {
options.encoding = "UTF-8"
}
(2) Test 태스크 - 테스트 실행
JUnit, TestNG 등의 테스트 프레임워크를 실행하는 데 사용된다.
사용 예제:
tasks.named<Test>("test") {
useJUnitPlatform() // JUnit 5 사용
}
(3) Assemble 태스크 - 패키징 실행
프로젝트의 빌드 결과물을 생성하는 태스크이다.
기본적으로 Jar, War 등의 태스크를 포함한다.
사용 예제:
tasks.named("assemble") {
dependsOn("jar") // jar 태스크를 먼저 실행
}
(4) Build 태스크 - 전체 빌드 수행
assemble, test 등을 포함하여 프로젝트의 전체 빌드를 수행한다.
사용 예제:
tasks.named("build") {
dependsOn("test")
}
결론
Gradle의 빌트인 태스크는 파일 복사, 압축, 빌드, 테스트, 실행 등 다양한 작업을 자동화할 수 있도록 돕는다.
각 태스크의 동작을 이해하고 적절히 활용하면 빌드 스크립트를 더욱 효율적으로 구성할 수 있다.