안드로이드의 그레이들 버전 카탈로그

Gradle 버전 카탈로그를 사용하면 의존성을 쉽고 확장 가능한 방식으로 추가하고 유지 관리할 수 있습니다. 앱이 성장하고 여러 개발 팀으로 관리되는 프로젝트는 컴파일 시간이 증가합니다.

이 문제를 해결하기 위한 한 가지 가능한 해결책은 프로젝트를 여러 모듈로 분할하는 것입니다. 이러한 모듈을 병렬로 컴파일하고 수정된 부분만 재컴파일하면 전체 컴파일 시간이 감소합니다. 그러나 문제가 발생합니다: 어떻게 우리는 공통 라이브러리 의존성과 그 버전을 효과적으로 공유하면서 컴파일 오류를 피하고 각 모듈의 Gradle 파일을 수동으로 검토하여 동기화 문제를 방지할 수 있습니까?

Gradle 버전 카탈로그는 모듈에서 호출할 수 있는 단일 파일에 모든 의존성을 중앙 집중화하는 데 도움이 됩니다.

버전 파일 생성

먼저 Gradle 폴더에 파일을 생성해야 합니다. 규칙에 따라 Android 개발 가이드에서 권장하는 libs.version.toml이라는 이름을 사용합니다.

이 파일에는 세 가지 섹션이 있습니다:

 

[versions]

[libraries]

[plugins]

  • 버전. 다른 두 블록에서 사용되는 의존성과 플러그인의 버전을 정의합니다.
  • 라이브러리. 의존성을 포함합니다.
  • 플러그인. 플러그인을 포함합니다.

예를 들어 Koin 의존성 주입 라이브러리의 버전과 의존성을 정의해 보겠습니다.

 

[versions]
koin = "3.4.0"

[libraries]
koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" }
koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" }
koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" }
koin-androidx-workmanager = { group = "io.insert-koin", name = "koin-androidx-workmanager", version.ref = "koin" }
koin-test = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" }
koin-test-junit4 = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" }

그런 다음 모든 모듈에서 의존성을 호출하려면 다음을 수행하면 됩니다:

 

Dependencies {
    implementation(libs.koin.core)
    implementation(libs.koin.android)
}

플러그인을 생성하고 모든 모듈이 항상 동기화됩니다.

의존성 마이그레이션이 이미 완료된 후, 문제가 발생했습니다. Koin을 필요로 하는 모든 모듈은 동일한 코드 줄을 반복해야 합니다. 여기서 DRY(Don’t Repeat Yourself) 원칙의 명확한 예를 볼 수 있으며, 이를 반복하지 않도록 Gradle 플러그인을 만들어 우리를 구원할 것입니다.

우리의 build.gradle.kts 파일에서 이 Gradle 플러그인을 등록할 수 있습니다.

 

gradlePlugin {
    plugins {
            register("koin") {
                    id = "example.android.koin"
                    implementationClass = "AndroidKoinConventionPlugin"
                }
}
}

그런 다음, 이 플러그인을 만들고 GVC를 사용하여 이 플러그인의 의존성을 추가할 것입니다.

 

class AndroidKoinConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")
            dependencies {
      "implementation"(libs.findLibrary("koin.core").get())
      "implementation"(libs.findLibrary("koin.android").get())
      "implementation"(libs.findLibrary("koin.androidx.compose").get())
      "implementation"(libs.findLibrary("koin.androidx.workmanager").get())
      "testImplementation"(libs.findLibrary("koin.test").get())
      "testImplementation"(libs.findLibrary("koin.test.junit4").get())
            }
        }
    }
}

마지막으로 모듈에 Koin 플러그인을 호출하면 되며, 언젠가 버전을 업그레이드해야 할 경우 정의 파일로 이동하여 Gradle을 동기화할 때 모두 업데이트됩니다. 예를 들어, 모든 의존성을 가진 데이터 모듈 파일

 

plugins {
    id("example.android.library")
    id("example.android.koin")
}

android {
    namespace = "com.example.core.data"
}

dependencies {
    implementation(libs.kotlinx.coroutines.android)
}

이 모든 것을 통해 의존성을 그룹화하는 플러그인을 생성할 수 있습니다. 예를 들면:

  • 라이브러리
  • Compose
  • 플래비츠
  • 기능
  • DI
  • 데이터베이스
  • 테스트

고려사항

Gradle 버전 카탈로그는 아직 완전한 개발 중이며, Android가 발표하는 알려진 버그와 제한 사항을 따라가는 것이 좋습니다. 이 기사의 예시들은 Gradle 버전 카탈로그의 이점과 이를 통해 우리의 삶을 더 수월하게 만들 수 있는 방법을 보여줍니다. 그것의 기능적 응용 사례를 찾고 있다면 GitHub에서 Android용으로 지금 확인할 수 있습니다.

Source:
https://dzone.com/articles/gradle-version-catalogs-on-android