2025-02-22T01:13:24

This commit is contained in:
2025-02-22 01:13:24 +09:00
parent 1fb14102bb
commit fb0a05d18f
83 changed files with 4955 additions and 23 deletions

353
doc/03_Gradle 태스크.md Normal file
View File

@@ -0,0 +1,353 @@
# 태스크(Task)
Gradle은 태스크(Task) 기반 빌드 시스템으로, 프로젝트를 구성하고 자동화할 수 있는 강력한 기능을 제공한다.
태스크(Task)는 Gradle에서 실행 가능한 단위이며, 프로젝트를 빌드하는 데 필요한 작업(예: 컴파일, 테스트, 패키징 등)을 정의한다. Gradle은 기본적으로 여러 태스크를 제공하지만, 사용자가 직접 정의하여 실행할 수도 있다.
## 태스크 목록 확인
```bash
./gradlew tasks
```
## 기본적인 태스크 정의와 실행
Gradle에서는 `build.gradle.kts` 파일에서 태스크를 정의할 수 있다.
### 간단한 태스크 정의
Kotlin DSL을 사용하여 기본적인 태스크를 정의하는 방법을 살펴보자.
```kotlin
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}
```
위 태스크는 `hello`라는 이름으로 등록되며, 실행하면 `"Hello, Gradle!"`이 출력된다.
#### `tasks.register` vs `tasks.create`
태스크를 등록하는 방법에는 `tasks.register``tasks.create`가 있다.
```kotlin
// 지연 평가 방식 (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`를 사용하는 것이 권장된다.
### 태스크 실행 방법
터미널에서 다음 명령어를 실행하면 정의한 태스크를 실행할 수 있다.
```sh
./gradlew hello
```
### 여러 액션을 포함한 태스크
태스크 내에서 여러 개의 액션을 정의할 수도 있다.
```kotlin
tasks.register("greet") {
doFirst {
println("처음 실행되는 액션")
}
doLast {
println("마지막으로 실행되는 액션")
}
}
```
이 태스크를 실행하면 `"처음 실행되는 액션"`이 먼저 출력되고, `"마지막으로 실행되는 액션"`이 나중에 출력된다.
### 태스크 종속성(Task Dependencies)
특정 태스크가 다른 태스크 이후에 실행되도록 설정할 수 있다.
```kotlin
tasks.register("taskA") {
doLast {
println("Task A 실행")
}
}
tasks.register("taskB") {
dependsOn("taskA") // taskA가 먼저 실행됨
doLast {
println("Task B 실행")
}
}
```
위 예제에서 `taskB`를 실행하면 `taskA`가 먼저 실행된 후 `taskB`가 실행된다.
## 사용자 정의 확장 프로퍼티
Gradle에서는 사용자 정의 확장 프로퍼티를 추가할 수 있다.
```kotlin
val greeting: String by project
tasks.register("customGreet") {
doLast {
println("Greeting message: $greeting")
}
}
```
그리고 `gradle.properties` 파일에 값을 추가하면 실행 시 사용할 수 있다.
```properties
greeting=Hello, Kotlin DSL!
```
## 빝트인 태스크
```kotlin
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` 태스크는 특정 디렉터리나 파일을 다른 위치로 복사하는 데 사용된다.
**사용 예제:**
```kotlin
tasks.register<Copy>("copyFiles") {
from("src/main/resources") // 복사할 원본 디렉터리
into("build/copied-resources") // 복사 대상 디렉터리
}
```
**고급 예제 (파일 필터링 적용):**
```kotlin
tasks.register<Copy>("copySpecificFiles") {
from("src/assets")
into("build/assets")
include("**/*.png") // PNG 파일만 복사
exclude("temp/**") // temp 폴더 제외
}
```
---
### **(2) Sync 태스크 - Copy와 유사하지만 대상 디렉터리를 동기화**
`Sync` 태스크는 `Copy`와 유사하지만, **대상 디렉터리에 없는 파일을 삭제하여 동기화**하는 점이 다르다.
**사용 예제:**
```kotlin
tasks.register<Sync>("syncFiles") {
from("src/main/resources")
into("build/synced-resources")
}
```
---
### **(3) Delete 태스크 - 파일 및 디렉터리 삭제**
`Delete` 태스크는 특정 파일이나 디렉터리를 삭제하는 데 사용된다.
**사용 예제:**
```kotlin
tasks.register<Delete>("cleanOutput") {
delete("build/output")
}
```
---
## **3. 압축 관련 태스크**
### **(1) Zip 태스크 - ZIP 압축 파일 생성**
`Zip` 태스크를 사용하면 특정 파일 및 디렉터리를 `.zip` 파일로 압축할 수 있다.
**사용 예제:**
```kotlin
tasks.register<Zip>("zipFiles") {
from("src/main/resources")
archiveFileName.set("resources.zip") // 생성할 ZIP 파일 이름
destinationDirectory.set(file("build/distributions")) // ZIP 저장 위치
}
```
**고급 예제 (파일 선택 및 압축 내 경로 설정):**
```kotlin
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`)을 생성하는 데 사용된다.
**사용 예제:**
```kotlin
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` 태스크는 쉘 명령어 또는 외부 프로세스를 실행할 때 사용된다.
**사용 예제:**
```kotlin
tasks.register<Exec>("runShellCommand") {
commandLine("ls", "-l") // 리눅스/macOS에서 파일 목록 출력
}
```
**Windows에서 사용 예제:**
```kotlin
tasks.register<Exec>("runBatchScript") {
commandLine("cmd", "/c", "dir") // Windows에서 디렉터리 목록 출력
}
```
---
### **(2) JavaExec 태스크 - Java 애플리케이션 실행**
Java 실행 가능한 프로그램을 실행할 때 사용한다.
**사용 예제:**
```kotlin
tasks.register<JavaExec>("runJavaApp") {
mainClass.set("com.example.Main") // 실행할 클래스
classpath = sourceSets.main.get().runtimeClasspath
}
```
---
## **5. 빌드 및 테스트 관련 태스크**
### **(1) CompileJava 태스크 - Java 코드 컴파일**
Java 코드를 컴파일하는 데 사용된다.
**사용 예제:**
```kotlin
tasks.named<JavaCompile>("compileJava") {
options.encoding = "UTF-8"
}
```
---
### **(2) Test 태스크 - 테스트 실행**
JUnit, TestNG 등의 테스트 프레임워크를 실행하는 데 사용된다.
**사용 예제:**
```kotlin
tasks.named<Test>("test") {
useJUnitPlatform() // JUnit 5 사용
}
```
---
### **(3) Assemble 태스크 - 패키징 실행**
프로젝트의 빌드 결과물을 생성하는 태스크이다.
기본적으로 `Jar`, `War` 등의 태스크를 포함한다.
**사용 예제:**
```kotlin
tasks.named("assemble") {
dependsOn("jar") // jar 태스크를 먼저 실행
}
```
---
### **(4) Build 태스크 - 전체 빌드 수행**
`assemble`, `test` 등을 포함하여 프로젝트의 전체 빌드를 수행한다.
**사용 예제:**
```kotlin
tasks.named("build") {
dependsOn("test")
}
```
---
## **결론**
Gradle의 빌트인 태스크는 파일 복사, 압축, 빌드, 테스트, 실행 등 다양한 작업을 자동화할 수 있도록 돕는다.
각 태스크의 동작을 이해하고 적절히 활용하면 **빌드 스크립트를 더욱 효율적으로 구성**할 수 있다.