2025-02-22T01:13:24
This commit is contained in:
136
doc/09_buildSrc.md
Normal file
136
doc/09_buildSrc.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# `buildSrc` 디렉터리
|
||||
|
||||
Gradle을 사용하다 보면 여러 프로젝트에서 반복적으로 사용되는 **커스텀 태스크(Task)나 플러그인**을 정의해야 할 때가 있다. 이때, 가장 효과적인 방법 중 하나가 `buildSrc` 디렉터리를 활용하는 것이다.
|
||||
|
||||
`buildSrc`는 Gradle에서 **자동으로 인식하는 특별한 디렉터리**이다.
|
||||
- 이 디렉터리 안에 작성된 코드들은 **Gradle 빌드 로직**에서 바로 사용할 수 있다.
|
||||
- 플러그인, 커스텀 태스크, 공통 설정 등을 정의할 때 유용하다.
|
||||
- Gradle의 **빌드 스크립트(`build.gradle.kts`)보다 먼저 컴파일**되므로, 커스텀 빌드 로직을 쉽게 적용할 수 있다.
|
||||
|
||||
`buildSrc`의 특징 :
|
||||
1. **자동 컴파일 & 인식**
|
||||
- Gradle이 `buildSrc`를 자동으로 감지하고, `build.gradle.kts`에서 바로 사용할 수 있다.
|
||||
2. **별도의 설정이 필요 없음**
|
||||
- `settings.gradle.kts`에서 추가적인 설정 없이 바로 적용 가능하다.
|
||||
3. **멀티 프로젝트에서도 사용 가능**
|
||||
- 루트 프로젝트(`rootProject/buildSrc`)에 배치하면 모든 서브 프로젝트에서 공유할 수 있다.
|
||||
|
||||
|
||||
## `buildSrc` 기본 구조
|
||||
|
||||
`buildSrc`는 Gradle의 일반적인 프로젝트와 동일한 구조를 가진다.
|
||||
|
||||
```
|
||||
├── buildSrc
|
||||
│ ├── build.gradle.kts # buildSrc 자체 빌드 스크립트
|
||||
│ ├── settings.gradle.kts
|
||||
│ └── src
|
||||
│ └── main
|
||||
│ └── kotlin
|
||||
│ ├── buildlogic.java-application.gradle.kts
|
||||
│ ├── buildlogic.java-common.gradle.kts
|
||||
│ └── buildlogic.java-library.gradle.kts
|
||||
```
|
||||
|
||||
### `build.gradle.kts` 예제
|
||||
`buildSrc` 디렉터리는 Gradle의 서브 프로젝트처럼 동작하므로, `build.gradle.kts` 파일을 통해 라이브러리를 추가할 수 있다.
|
||||
|
||||
```kotlin
|
||||
plugins {
|
||||
kotlin("jvm") version "1.8.10"
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib")
|
||||
}
|
||||
```
|
||||
|
||||
## `buildSrc`를 활용한 커스텀 태스크 생성
|
||||
|
||||
Gradle의 기본 태스크 외에 **사용자 정의 태스크(Custom Task)**를 만들 수 있다.
|
||||
예를 들어, 특정 파일을 복사하는 커스텀 태스크를 만들어 보자.
|
||||
|
||||
### 커스텀 태스크 작성 (`CustomTask.kt`)
|
||||
`buildSrc/src/main/kotlin/myplugin/CustomTask.kt`
|
||||
```kotlin
|
||||
package myplugin
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
import java.io.File
|
||||
|
||||
abstract class CustomTask : DefaultTask() {
|
||||
|
||||
@TaskAction
|
||||
fun run() {
|
||||
val source = File("src/main/resources/sample.txt")
|
||||
val destination = File("build/sample-copy.txt")
|
||||
|
||||
if (source.exists()) {
|
||||
destination.writeText(source.readText())
|
||||
println("파일 복사 완료: ${destination.absolutePath}")
|
||||
} else {
|
||||
println("⚠️ 원본 파일이 존재하지 않습니다!")
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 커스텀 태스크 사용하기
|
||||
이제 `build.gradle.kts`에서 바로 사용할 수 있다.
|
||||
|
||||
`build.gradle.kts`
|
||||
```kotlin
|
||||
tasks.register<myplugin.CustomTask>("copySampleFile")
|
||||
```
|
||||
실행해보자.
|
||||
```sh
|
||||
./gradlew copySampleFile
|
||||
```
|
||||
|
||||
## `buildSrc`를 활용한 커스텀 플러그인 생성
|
||||
|
||||
커스텀 태스크 외에도, Gradle의 **플러그인(Plugin)**을 정의할 수도 있다.
|
||||
예를 들어, 프로젝트에 공통적인 설정을 적용하는 `MyCustomPlugin`을 만들어보자.
|
||||
|
||||
### 커스텀 플러그인 작성 (`MyCustomPlugin.kt`)
|
||||
`buildSrc/src/main/kotlin/myplugin/MyCustomPlugin.kt`
|
||||
```kotlin
|
||||
package myplugin
|
||||
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
|
||||
class MyCustomPlugin : Plugin<Project> {
|
||||
override fun apply(project: Project) {
|
||||
project.tasks.register("helloPlugin") {
|
||||
doLast {
|
||||
println("MyCustomPlugin이 적용되었습니다!")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 커스텀 플러그인 적용하기
|
||||
이제 `build.gradle.kts`에서 다음과 같이 플러그인을 적용할 수 있다.
|
||||
|
||||
`build.gradle.kts`
|
||||
```kotlin
|
||||
plugins {
|
||||
id("myplugin.mycustomplugin")
|
||||
}
|
||||
```
|
||||
|
||||
플러그인 실행:
|
||||
```sh
|
||||
./gradlew helloPlugin
|
||||
```
|
||||
출력 결과:
|
||||
```sh
|
||||
MyCustomPlugin이 적용되었습니다!
|
||||
```
|
||||
Reference in New Issue
Block a user