이전 포스팅에서 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 모듈을 생성했다면 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.properties 및 settings.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 브랜치를 확인하시면 됩니다.
'안드로이드 > 멀티 모듈' 카테고리의 다른 글
[안드로이드 멀티 모듈] 6. AndroidApplicationComposeConventionPlugin 만들기 (0) | 2024.08.07 |
---|---|
[안드로이드 멀티 모듈] 5. BuildTypes 컨벤션 플러그인에 적용하기 (0) | 2024.08.02 |
[안드로이드 멀티 모듈] 4. AndroidApplicationConventionPlugin 만들기 (0) | 2024.08.01 |
[안드로이드 멀티 모듈] 2. 모듈 생성 후 관계 정의하기 (0) | 2024.07.30 |
[안드로이드 멀티 모듈] 1. 멀티 모듈 개념과 장단점 (0) | 2024.07.29 |