Framework | Library | Tool/tool

Gradle Multi-module 프로젝트에서 Build Logic 공유하기

주정용 2024. 6. 10. 19:12
728x90

Precompiled Script로 작성한 빌드 로직을 각 모듈에 적용하는 방법을 기록합니다.
아래 예제 코드는 Kotlin dsl로 Spring Boot 프로젝트를 구성합니다.

(Kotlin 2.0.0, Spring Boot 3.3.0, Gradle 8.7)

buildSrc/build.gradle.kts

내 빌드 스크립트에 외부 플러그인을 적용하려면 buildSrc/build.gradle.kts에서 외부 플러그인 의존성을 선언합니다.
외부 의존성 내 플러그인에 적용하기

// kotlin dsl plugin을 선언합니다. 따옴표가 아닌, 벡틱입니다.
plugins {  
    `kotlin-dsl`  
}  

repositories {  
    mavenCentral()  
}  

dependencies {  
    implementation("org.springframework.boot:spring-boot-gradle-plugin:3.3.0")  
    implementation("io.spring.gradle:dependency-management-plugin:1.1.5")  
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0")  
    implementation("org.jetbrains.kotlin:kotlin-allopen:2.0.0")  
}

buildSrc/src/main/kotlin/common-convetions.gradle.kts

각 모듈이 공유할 빌드 스크립트를 선언합니다.
애플리케이션 빌드시점에 buildSrc 하위에 작성한 빌드 스크립트가 가장 먼저 실행됩니다.

import org.gradle.api.JavaVersion  
import org.gradle.api.tasks.testing.Test  
import org.gradle.kotlin.dsl.*  
import org.jetbrains.kotlin.gradle.dsl.JvmTarget  
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion  
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile  

plugins {  
    id("org.springframework.boot")  
    id("io.spring.dependency-management")  
    kotlin("jvm")  
    kotlin("plugin.spring")  
}  

group = "com.honeyjoojoo"  
version = "0.0.1-SNAPSHOT"  

java {  
    sourceCompatibility = JavaVersion.VERSION_21  
}  

configurations {  
    compileOnly {  
        extendsFrom(configurations.annotationProcessor.get())  
    }  
}  

repositories {  
    mavenCentral()  
}  

extra["springCloudVersion"] = "2023.0.2"  

dependencyManagement {  
    imports {  
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")  
    }  
}  

dependencies {  
    implementation("org.springframework.boot:spring-boot-starter")  
    implementation("org.jetbrains.kotlin:kotlin-reflect")  
    developmentOnly("org.springframework.boot:spring-boot-devtools")  
    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")  
    testImplementation("org.springframework.boot:spring-boot-starter-test")  
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")  
}  

kotlin {  
    compilerOptions {  
        apiVersion.set(KotlinVersion.KOTLIN_2_0)  
        jvmTarget.set(JvmTarget.JVM_21)  
        freeCompilerArgs.add("-Xjsr305=strict")  
    }  
}  

tasks.withType<Test> {  
    useJUnitPlatform()  
}

api/build.gradle.kts

plugins {  
    id("common-conventions")  
}  

dependencies {  
    implementation(project(":application"))  
    implementation("org.springframework.boot:spring-boot-starter-validation")  
    implementation("org.springframework.boot:spring-boot-starter-web")  
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")  
}

gateway/build.gradle.kts

plugins {  
    id("common-conventions")  
}  

dependencies {  
    implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")  
    implementation("org.springframework.cloud:spring-cloud-starter-gateway")  
    implementation("org.springframework.boot:spring-boot-starter-oauth2-client")  
}

'Framework | Library | Tool > tool' 카테고리의 다른 글

Homebrew 유용한 명령어  (0) 2023.01.01
Gradle 멀티 모듈 길라잡이  (0) 2022.07.04