안녕하세요.
오늘은 Gradle 버전 카탈로그에 대해 간단히 알아보려고 합니다!
Gradle 버전 카탈로그는?
Gradle 버전 카탈로그는 멀티 모듈 프로젝트에서 의존성을 쉽게 공유하고 쉽게 관리할 수 있는 Gradle의 기능 중 하나입니다. 사실 최근에 추가된 기능은 아니고 Gradle 7부터 지원을 시작했다고 해요. extesion이나 buildSrc를 통해 의존성 버전을 관리해 오다가 최근 nowInAndroid에서 버전 카탈로그를 사용하는 것을 보고 관심이 생겨 알아보게 되었습니다
사용 방법
버전 카탈로그는 Gradle 파일에서 versionCatalog 함수에서 library, plugin 등 을 직접 정의해서 사용할 수 있지만, 제가 찾아보았던 대부분 Android 예제에서는 toml 파일을 생성하고 해당 파일에서 의존성을 전부 관리하기 때문에 versionCatalog 함수에 대해서는 소개하지 않으려고 합니다 :)
libs.versions.toml
// ./gradle/libs.versions.toml
[versions]
// 버전을 정의합니다.
...
[libraries]
// 라이브러리를 정의합니다.
...
[plugins]
// 플로그인을 정의합니다.
...
libs.version.toml 파일은 gradle 폴더 내부에 생성해야 합니다. Gradle 7.4부터 해당 경로에서 libs.versions.toml 이름의 파일을 찾기 때문에 실수로 이름을 잘못 입력하지 않게 주의하세요!
(저는 앞에 공백이 포함되어 있는 줄 모르고 몇 시간 동안 삽질했습니다 ㅜㅜ)
그런데 혹시나 Gradle 버전을 7.4 이상으로 올리지 못하는 프로젝트의 경우에는 gradle의 versionCatalog 함수에서 직접 toml의 경로를 명시해 줄 수 있으니 참고하세요.
Versions 선언 방법
[versions]
hilt = "2.44"
androidDesugarJdkLibs = "1.2.2" // camelCase로 네이밍
my-lib = { strictly = "[1.0, 2.0[", prefer = "1.2" } // rich versions 문법
- 버전은 기본적으로 단일 문자열 타입으로 정의할 수 있습니다.
- 버전 별칭의 네이밍 규칙은 카멜 케이스로 정의하는 것을 추천합니다 :) cc. nowInAndroid
- 특정 버전을 제외하는 등 규칙을 추가하려면 rich versions 문법을 확인하세요
Libraries 선언 방법
[libraries]
hilt-android = "com.google.dagger:hilt-android:2.44"
hilt-android2 = { group = "com.google.dagger", name = "hilt-android", version = "2.44" }
hilt-android3 = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
maven 라이브러리 규칙에 따라서 Android 의존성의 대부분은 {groupId}:{artifactId}:{version} 형태로 정의되고 있습니다. 버전 카탈로그의 규칙도 그와 비슷하게 group, name, version로 구분하여 정의할 수 있습니다.
- 라이브러리 또한 단일 문자열 하나로 정의할 수 있습니다.
- 라이브러리 버전 별칭의 네이밍 규칙은 신기하게도 케밥 케이스라고 합니다. (ex hilt-android) 케밥 케이스로 정의할 경우 IntelilJ의 Code completion 기능을 통해 자동 완성 기능을 사용할 수 있었습니다.
- 버전을 직접 문자열로 선언해도 괜찮습니다. 하지만 추천하지는 않습니다.
- version.ref를 통해 [versions]에서 정의한 버전을 별칭으로 가져올 수 있습니다.
dependencies {
// DI
implementation libs.hilt.android
kapt libs.hilt.compiler
}
Plugins 선언 방법
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin"}
- 플로그인의 네이밍 규칙도 케밥 케이스로 정의하면 좋아요. cc. Libraries 이랑 같은 이유
plugins {
alias(libs.plugins.android.application) apply false
}
// module build.gradle.kts
plugins {
alias(libs.plugins.android.application)
}
[주의] 버전이 없는 플로그인은 버전 카탈로그로 관리할 수 없네요 ㅜㅜ 기존처럼 id로 직접 명시해 주면 됩니다.
id 'java-library'
id 'org.jetbrains.kotlin.jvm'
느낀 점
- toml 파일 문법은 어렵지가 않아서 누구라도 한두 번 의존성을 추가해 보면 적응하기 쉬울 것 같아서 좋은 것 같아요.
- buildSrc와 달리 시스템적으로 plugin과 library의 의존성을 구분해서 선언할 수 있게 만들어줘서 가독성이 좋을 것 같아요.
- 어느 정도 규모가 있는 프로젝트의 경우 한 번에 버전 카탈로그로 마이그레이션 하기는 쉽지 않을 것 같아요. 컨벤션에 맞게 개발자가 직접 입력해줘야 하기 때문에 금방 지치게 되네요.
참고
- https://developer.android.com/build/migrate-to-catalogs
- https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
'Android > Gradle' 카테고리의 다른 글
[Android] 빌드 속도 개선 with Gradle Options (0) | 2022.11.09 |
---|---|
[Android] Spotless 설정으로 팀과 코드 컨벤션 맞추기 (3) | 2022.10.03 |
[Android] RepositoriesMode (0) | 2022.09.03 |