Files
gradle-examples/doc/09_buildSrc.md
2025-02-22 01:13:24 +09:00

4.2 KiB

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 파일을 통해 라이브러리를 추가할 수 있다.

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

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

tasks.register<myplugin.CustomTask>("copySampleFile")

실행해보자.

./gradlew copySampleFile

buildSrc를 활용한 커스텀 플러그인 생성

커스텀 태스크 외에도, Gradle의 **플러그인(Plugin)**을 정의할 수도 있다.
예를 들어, 프로젝트에 공통적인 설정을 적용하는 MyCustomPlugin을 만들어보자.

커스텀 플러그인 작성 (MyCustomPlugin.kt)

buildSrc/src/main/kotlin/myplugin/MyCustomPlugin.kt

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

plugins {
    id("myplugin.mycustomplugin")
}

플러그인 실행:

./gradlew helloPlugin

출력 결과:

MyCustomPlugin이 적용되었습니다!