안녕하세요 여러분!
오늘은 제가 최근 프로젝트에 빌드 로직(Build Logic)을 적용했던 경험에 대해서 공유하려고 합니다.
사실 프로젝트가 작을 때는 Gradle 설정하는건 별로 어렵지 않습니다.. 하지만 모듈이 점차 늘어나고 플러그인이 많아 질때마다 같은 작업을 반복하는건 정말 지옥이죠..☠️ 이 문제를 해결 할 수 있는 방법이 없을까 생각하다가 빌드 로직을 적용하게 되었습니다!

모듈은 Java or Kotlin Library로 만들어줍니다.


모듈 내부에 build.gradle 과 settings.gradle을 생성해주세요.
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
rootProject.name = "build-logic"
// build.gradle.kts
plugins {
`kotlin-dsl`
alias(libs.plugins.kotlin.serialization)
}
dependencies {
compileOnly(libs.kotlin.gradle.plugin)
compileOnly(libs.android.build.gradle)
compileOnly(libs.gradle.hilt)
}
class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) = with(target) {
pluginManager.apply {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
apply("org.jetbrains.kotlin.plugin.serialization")
}
extensions.configure<LibraryExtension> {
kotlinAndroidConfiguration(this)
buildConfigConfiguration(this)
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}
}
}
internal fun Project.kotlinAndroidConfiguration(
commonExtension: CommonExtension<*, *, *, *, *, *>,
) = with(commonExtension) {
compileSdk = 35
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
buildConfig = true
}
}
fun CommonExtension<*, *, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
(this as ExtensionAware).extensions.configure("kotlinOptions", block)
}
fun Project.buildConfigConfiguration(
commonExtension: CommonExtension<*, *, *, *, *, *>,
) = with(commonExtension) {
buildTypes {
getByName("release") {
buildConfigField("boolean", "APP_DEBUG", false.toString())
}
getByName("debug") {
buildConfigField("boolean", "APP_DEBUG", true.toString())
}
}
}
gradlePlugin {
plugins {
register("androidLibrary") {
id = "com.android.library.convention"
implementationClass = "AndroidLibraryConventionPlugin"
}
}
plugins {
id("com.android.library.convention")
}
android {
namespace = "com.test.example.module"
}
dependencies {
}
Library 모듈에 대한 Plugin뿐만 아니라 Compose , Hilt 혹은 Application Convention 등에 대해서도 한번 적용해 놓으면 개발이 훨씬 편해지는걸 느끼실수 있을겁니다!
아래 NowInAndroid Github 샘플 코드를 끝으로 Build Logic 적용기는 마치겠습니다. 🙇♂️
NowInAndroid Convention Plugin 예시