Version Catalog를 통한 버전 관리

이태훈·2021년 10월 8일
3

안녕하세요. 오늘은 version catalog를 통해 라이브러리 버전 관리 하는 법을 알아보겠습니다.

흔히들 사용하시는 버전 관리 방법은 아래와 같습니다.

  1. ext를 통한 버전 관리
  2. buildSrc를 통한 버전 관리
  3. composite build를 통한 버전 관리

하지만, 이번에 gradle이 7.0으로 업그레이드 되면서 추가된 version catalog를 통해 더욱 간편하게 버전 관리를 할 수 있게 됐습니다.

먼저, 프로젝트 최상단 폴더에 있는 settings.gradle.kts에 다음과 같은 코드를 추가해줍니다.

Gradle 버전이 7.4가 release 됨에 따라 version catalog 기능이 stable 해졌습니다.
7.4 이상의 버전을 사용하시는 분들은 아래와 같은 코드를 추가할 필요가 없습니다.

seetings.gradle.kts

enableFeaturePreview("VERSION_CATALOGS")

dependencyResolutionManagement {
    versionCatalogs {
        create("deps") {
            from(files("deps.version.toml"))
        }
    }
}

여기서, create("deps") 에서 파라미터를 어떤 이름을 넣어주시든 상관 없습니다. 맘에 드시는 걸로 넣어주시면 됩니다.
ex) deps, libs, ...

그리고, 버전을 명시해 줄 파일을 만듭니다. 여기서 만든 파일은 files("deps.version.toml")에서 쓰입니다.

파일을 루트 디렉토리의 gradle 폴더에 만들어주면 settings.gradle에 파일을 명시해줄 필요가 없습니다.

deps.version.toml

[versions]

kotlin = "1.5.31"
androidGradle = "7.0.2"
compose = "1.1.0-alpha03"

[plugins]
android = { id = "com.android.application", version.ref = "androidGradle" }
kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } 

[libraries]

kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", versions.ref = "kotlin" }

android-gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradle" }

androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" }
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "compose" }
androidx-compose-uiTooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }

[bundles]

androidx-compose = [ "androidx-compose-foundation", "androidx-compose-ui", "androidx-compose-material", "androidx-compose-uiTooling" ]

저는 위와 같이 구성해봤습니다.

보시는 바와 같이 파일은 세 가지 영역으로 나뉩니다. [versions], [libraries], [bundles]

versions와 libraries는 보시면 딱 감이 오실텐데 bundle은 여러 라이브러리를 묶어서 관리를 해줄 수 있는 거라 생각하시면 됩니다.

그럼 이제, 각 모듈의 build.gradle.kts로 가서 각 라이브러리를 추가해주면 끝입니다!! buildSrc보다 훨씬 간편하죠?

먼저, 프로젝트 최상단에 있는 build.gradle.kts로 가서 플러그인을 설정해줍니다.

catalog를 사용할 때 7.4 이상의 버전을 사용하시는 분들은 catalog를 직접 설정해주시면 에러가 발생하게 됩니다. 따라서 아래와 같이 다르게 설정해주시면 되겠습니다.

플러그인 설정 (old version)

build.gradle.kts

gradle version >= 7.4

dependencies {
    classpath(deps.kotlin.plugin)
    classpath(deps.android.gradle)
}


gradle version < 7.4

dependencies {
    val deps = project.extensions.getByType<VersionCatalogsExtension>().named("deps") as org.gradle.accessors.dm.LibrariesForDeps
    
    classpath(deps.kotlin.plugin)
    classpath(deps.android.gradle)
}

플러그인 설정 (new version)

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(deps.plugins.android) apply false
    alias(deps.plugins.kotlin) apply false
}

Suppress 관련해서 expression expected 에러가 뜨시는 분들은 @file:Suppress("DSL_SCOPE_VIOLATION") 로 바꿔주시면 됩니다.

gradle의 8.0 버전이 업데이트됨에 따라 alias를 통해 플러그인을 설치하는 것을 잠시 중단할 필요가 있을 것 같습니다.
링크를 참고하시면 kotlin script에서 declarative plugin block에서 새로운 인터프리터를 통해 빌드 속도가 상승했는데, alias를 통해 플러그인을 설치하는 것은 아직 지원하지 않는다고 합니다.

다음으로, 각 모듈에 있는 build.gradle.kts로 가서 라이브러리를 설정해줍니다.

module/build.gradle.kts

dependencies {

    // bundle을 통해 한꺼번에 관리
    implementation(deps.bundles.androidx.compose)
    
    // 각 라이브러리별로 관리
    implementation(deps.androidx.compose.foundation)
    implementation(deps.androidx.compose.ui)
    implementation(deps.androidx.compose.material)
    implementation(deps.androidx.compose.uiTooling)
}

프로젝트 최상단에 있는 build.gradle.kts에서 플러그인 설정할 때와는 달리 deps 변수를 설정해주지 않아도 자동으로 인식합니다.

라이브러리 버전이 필요할 때는 다음과 같이 하면 됩니다.

deps.versions.compose.get()

ex)
android {
    compileSdk = 31
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = deps.versions.compose.get()
    }
}

끄읕!

profile
https://www.linkedin.com/in/%ED%83%9C%ED%9B%88-%EC%9D%B4-7b9563237

0개의 댓글