[Android] Gradle Version Catalog를 이용한 버전 관리


개요

Android Studio에서 프로젝트를 개발할 때 의존성 버전으로 인한 빌드 오류를 자주 겪게 됩니다. 그래서 지금까지 ext 또는 buildSrc를 이용한 버전 관리 방법들이 등장했습니다. 그런데 gradle 버전이 7.0으로 업데이트 되면서 Version Catalog라는 새로운 버전 관리 방법을 제공하기 시작했습니다. 최근 프로젝트에서 적용해보았는데, 이에 대한 이점과 적용 방법에 대해 알아보겠습니다.


Version Catalog의 장점

  • 하나의 파일로 여러 프로젝트 및 모듈의 버전 관리를 통합할 수 있습니다.
  • 함께 사용되는 의존성들을 bundle로 묶어 선언할 수 있습니다.
  • IDE 상에서 각 카탈로그 별로 자동 완성을 지원하는 등 여러 편리 요소들이 있습니다.
  • 가독성면에서 뛰어납니다.


Version Catalog 적용

Gradle 버전 7.4 부터 Version Catalog를 정식 지원합니다. 해당 버전 미만일 경우 수동으로 toml파일을 잡아줘야 합니다. 따라서 Gradle 7.4 이상을 사용하시는 것을 권장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
// Gradle 7.4 미만일 경우
// settings.gradle.kts

enableFeaturePreview("VERSION_CATALOGS")

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


toml 생성

gradle/libs.versions.toml 을 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[versions]
kotlin = "1.6.21"

android-gradle = "7.2.1"
androidx-core = "1.8.0"
androidx-activity = "1.5.0"
androidx-navigation = "2.4.2"

compose = "1.2.0-beta03"
material3 = "1.0.0-alpha14"

[libraries]
kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }

android-gradle = { module = "com.android.tools.build:gradle", version.ref = "android.gradle" }
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" }

androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" }
androidx-compose-ui-core = { module = "androidx.compose.ui:ui", version.ref = "compose" }
androidx-compose-ui-tooling-core = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" }
androidx-compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "material3" }
androidx-compose-navigation = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation" }

[bundles]
compose = ["androidx-compose-ui-core", "androidx-compose-ui-tooling-core", "androidx-compose-ui-tooling-preview", "androidx-compose-material3", "androidx-activity-compose", "androidx-compose-navigation"]
  • versions: 라이브러리들의 버전
  • libraries: 라이브러리 의존성
  • bundles: 라이브러리들을 묶어 한 번에 선언

따로 toml 문법 지식이 없더라도 바로 이해할 수 있을 만큼 가독성이 뛰어납니다.


프로젝트 build.gradle.kts 수정

루트 프로젝트의 build.gradle.kts에 다음과 같이 플러그인들을 설정해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
buildscript {
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        // version catalog 적용
        classpath(libs.android.gradle)
        classpath(libs.kotlin.plugin)
    }
}


모듈 build.gradle.kts 수정

이제 각 모듈 별로 catalog를 불러와 의존성을 추가할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
dependencies {
    
    // 하나씩 추가
    implementation(libs.androidx.compose.core)
    implementation(libs.androidx.compose.material3)
    implementation(libs.androidx.activity.compose)

    // 번들로 일괄 추가
    implementation(libs.bundles.compose)
}

IDE 상에서 입력해보면, catalog 별로 자동완성을 지원함을 알 수 있습니다. 따라서 간편하게 추가가 가능합니다.


버전 정보 가져오기

추가로 다음과 같이 라이브러리 버전을 불러올 수도 있습니다.

1
2
3
4
5
6
7
8
9
android {
    compileSdk = 31
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = libs.versions.compose.get() // toml versions 가져오기
    }
}


이와 같이 Version Catalog를 이용하면, 하나의 파일만 관리하여 여러 프로젝트에서의 버전 관리를 바로바로 할 수 있음을 알 수 있습니다.


참고

0%