본문 바로가기

안드로이드/멀티 모듈

[안드로이드 멀티 모듈] 3. build-logic 모듈 만들기


이전 포스팅에서 4개의 모듈을 만들었는데 각각 build.gradle.kts 파일이 생성되었고, 아래처럼 빌드와 관련된 중복 코드가 증가했습니다. 앱이 커질수록 모듈과 중복 코드는 계속 증가할 것입니다.

// build.gradle.kts (Module :home:data)
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.multi.module.home.data"
    compileSdk = 34
    ...
}
...
// build.gradle.kts (Module :home:presentation)
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.multi.module.home.presentation"
    compileSdk = 34
    ...
}
...


중복코드를 제거하고 한 곳에서 관리하기 위한 방법은 몇 가지가 존재하는데, 최근에는 build-logic 모듈을 만들어서 관리하고 있습니다. 먼저 build-logic을 세팅하겠습니다.

1. build-logic 모듈 생성하기

File -> New -> New Module을 선택한 후, Java or Kotlin Library로 아래처럼 build-logic 모듈을 만들어줍니다.
build-logic 모듈에는 Custom Plugin을 만들어야 하는데 Convention Plugin이라고 표현합니다.
그래서 모듈을 build-logic:convention로 생성했습니다.

build-logic 모듈을 생성하는 모습
build-logic 모듈을 생성하는 모습


build-logic 모듈을 생성했다면 settings.gradle.kts 파일에 includeBuild("build-logic")을 작성해야 합니다.
왜냐하면 안드로이드 스튜디오 또는 Gradle에서는 일반 Kotlin Module과 Build Module을 구별할 수 없기 때문입니다.

// settings.gradle.kts (Project Settings)
pluginManagement {

    includeBuild("build-logic")
    
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}


enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

rootProject.name = "MultiModuleTemplate"
include(":app")
include(":home:presentation")
include(":home:data")
include(":core:presentation:designsystem")
include(":home:domain")

 

2. build-logic 모듈 설정하기

build-logic 빌드와 관련된 설정을 하겠습니다.

Gradle에게 빌드하는 방법을 제공해 주고, build-logic에서 추가하는 의존성을 다운로드할 원격 저장소 위치를 알려주어야 하므로 build-logic 모듈의 루트 경로에 gradle.propertiessettings.gradle.kts 파일을 생성하고 아래와 같이 입력하겠습니다.

// build-logic의 gradle.properties
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
// build-logic의 settings.gradle.kts  
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }

    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

rootProject.name = "build-logic"
include(":convention")


build-logic 모듈에 생성한 settings.gradle.kts를 보면 rootProject 이름을 'build-logic'으로 지정해 주고 convention 모듈을 포함하도록 설정했습니다. 그리고 versionCatalogs 파일의 경로를 입력했습니다.

3. build-logic:convention 모듈 설정하기

이번에는 build-logic:convention 모듈에 대한 설정을 진행하겠습니다.

// build.gradle.kts (Module :build-logic:convention)
plugins {
   `kotlin-dsl`
}

group = "com.multi.module.buildlogic"


dependencies {
   // versionCatalogs에 관한 정보는 하단의 git 링크를 통해 확인해주세요.
   compileOnly(libs.android.gradlePlugin)
   compileOnly(libs.android.tools.common)
   compileOnly(libs.kotlin.gradlePlugin)
   compileOnly(libs.ksp.gradlePlugin)
   compileOnly(libs.room.gradlePlugin)
}


convention 모듈에서는 Kotlin DSL을 사용해서 Convention Plugin을 만들기 때문에 플러그인데 kotlin-dsl을 추가해야 합니다. 그리고 안드로이드, 코틀린, ksp, room 등과 같은 기능을 사용하기 위해 플러그인과 관련된 의존성을 추가했습니다.

build-logic 모듈에서 생성하는 모든 플러그인은 컴파일 중에만 관련이 있고 런타임 중에는 아무것도 하지 않기 때문에 implementation이 아닌 compileOnly를 사용했습니다.

4. 정리

이번 포스팅에서는 build-logic:convention 모듈을 만들어서 build-logic과 convention 모듈을 설정했습니다.

다음 포스팅에서는 모듈을 생성할 때마다 생기는 build.gradle.kts 파일의 중복코드를 제거하기 위해서 Custom Convention Plugin을 만들겠습니다.

다소 어렵고 난해한 부분이 있었는데 Gradle을 처음 접하는 분들이라면 혼란스러운 게 지극히 정상적인 일이라고 생각이 들고, Gradle 설정과 관련해서 시간을 많이 소요하지 않았으면 좋겠습니다. 나중에 자연스럽게 이해될 수 있기 때문입니다.

이번 포스팅의 결과물은 아래 Github Repository의 3-SettingUpBuildLogic 브랜치를 확인하시면 됩니다.

 

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com

반응형