다중 모듈 프로젝트를 도입하면서, 각 모듈에서 참조하는 종속성과 종속성간 버전 관리에 대해서 생각해보게 되었다. 그러던 중 Now in Android에서 Version Catalog를 통해서 중앙에서 종속성 버전 관리를 하고 있는 것을 알게되었다. 이번에는 Version Catalog의 소개와 해당 Version Catalog를 도입하는 방법에 대해서 포스팅하려고 한다.
What is Version Catalog?
A version catalog is a list of dependencies, represented as dependency coordinates,
that a user can pick from when declaring dependencies in a build script.
Version Catalog는 빌드 스크립트에서 종속성을 선언할 때 사용자가 선택할 수 있는 종속성의 목록이다.
Version Catalog 이점
Using Gradle version catalogs makes managing dependencies and plugins easier
when you have multiple modules. You can create a central version catalog of dependencies
that various modules can reference in a type-safe way with Android Studio assistance.
Version Catalog를 사용하면, 멀티 모듈간의 종속성과 플러그인을 관리하는데 도움을 준다. 또한 각 모듈의 종속성을 Version Catalog에서 관리하고 있어, type-safe한 방법으로 종속성을 참조할 수 있다.
setting.gradle.kts
dependencyResolutionManagement {
...
versionCatalogs{
create("libs"){
from(files("gradle/libs.version.toml"))
}
}
}
setting.gradle(.kts)에 사용할 Version Catalog를 선언한다. Version Catalog의 종속성을 호출하는 방식이기에, Version Catalog에 새로운 종속성을 추가하거나, 버전을 업데이트를 해도 따로 Re Build를 할 필요가 없다.
각 모듈에서 libs를 type-safe한 형태로 호출할 수 있다.
How to use Version Catalog?
1. version.toml 생성하기
version.toml는 사용할 종속성의 버전을 선언하고, 관리할 수 있는 파일이다. version.toml는 총 4가지 단락로 구분된다. [version], [libraries], [bundles], [plugins] (공식 안드로이드 페이지에서는 [bundles]를 제외한 3가지만을 소개.)
- [version] : 아래의 단락에서 사용할 종속성과 플러그인의 version을 정의하는 단락
- [libraries] : 사용할 종속성을 버전과 함께 별칭으로 정의하는 단락으로, 사용할 때 별칭을 통해 호출한다.
- [bundles] : 여러개의 종속성을 묶어 번들로 정의하는 단락.
- [plugins] : 사용할 플러그인의 버전과 함께 별칭으로 정의하는 단락으로, 사용할 때 별칭을 통해 호출한다.
version.toml
[versions]
google-crashlytics-plguin = "2.9.4"
google-firebase = "31.4.0"
[libraries]
firebase = { module = "com.google.firebase:firebase-bom", version.ref = "google-firebase" }
firebase-analytics = { module = "com.google.firebase:firebase-analytics-ktx" }
firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics-ktx" }
[bundles]
firebase = ["firebase", "firebase", "firebase-crashlytics", "firebase-analytics"]
[plugins]
google-firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "google-crashlytics-plguin" }
단락안에서 종속성은 그룹 및 하위 모듈의 탐색의 용이성 및 IDE의 기능을 통해 자동완성을 활용할 수 있는 케밥 케이스로 작성하는 것을 추천하고 있다.
2. setting.gradles에 선언하기
setting.gradles에 VersionCatalogs 단락을 통해 Version Catalog를 선언한다.
3. 모듈에서 종속성/플러그인 호출하기
libraries와 plugins는 Version Catalog때 정의한 별칭으로 호출할 수 있다. libraries의 호출은 위의 코드를 통해서 확인할 수 있고,
plugins의 선언방법은 아래와 같다.
libs가 빨간줄이 뜨는 이유는 Kotlin DSL의 plugins 블록에서 Version Catalog 접근자에 대한 액세스를 얻지 못하고 있기 떄문이라고 한다. (https://github.com/gradle/gradle/issues/22797 자세한 것은 참조)
실제 사용에는 문제가 없다.
도입하며 느낀 점 / 결론
다중 모듈 프로젝트를 하기 전에는 해당 버전 카탈로그에 대해 알지 못했다. 사실 필요성을 느끼지 못해 알아보지 않은 것 같다. 이전에는 하나의 모듈에서만 관리하면 되고, 중복되는 버전은 ext로 나름 불편함이 없이 처리했다. 그러나 프로젝트가 커지면서, 다중 모듈 프로젝트를 도입함에 따라 각 모듈에서 사용할 종속성을 중앙에서 제어할 기능이 필요로 해졌고, 버전 카탈로그를 알게되었다. 이렇게 중앙에서 관리하다 보니, 확실히 버전 관리에 있어 용이함을 느꼈고, third party(renovate bot)를 통해서 자동으로 버전 업그레이드를 할 수 있다는 장점도 있었다. 또한 확실히 간결해진 build.gradle 파일을 확인할 수 있었다.
참고 문헌
https://developer.android.com/build/migrate-to-catalogs
Migrate your build to version catalogs | Android Studio | Android Developers
Migrate your Gradle configuration files to Gradle version catalogs.
developer.android.com
https://brunch.co.kr/@purpledev/46
Version Catalog 도입을 위한 온보딩
gradle 버전 관리를 위한 Version Catalog 도입 | 안녕하세요. 서비스 개발팀 Android 개발자 두루라고 합니다. 최근 프로젝트에 도입하려고 하는 gradle 버전 관리를 위한 Version Catalog 온보딩 내용에 대해
brunch.co.kr
https://velog.io/@vov3616/Gradle-2.-Version-Catalog-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
[Gradle] 2. Version Catalog 알아보기
Version Catalog에 대해 알아보는시간을 가져보자!
velog.io