Nia 프로젝트 분석하기 첫 주제로 Gradle Version Catalog 에 대해서 알아보려고 합니다.
Gradle은 안정적인 빌드 환경을 구축하기 위한 필수 도구 중 하나입니다.
하지만 Gradle의 버전 관리는 어렵고 예전부터 여러가지의 방법으로 관리를 해오고 있었습니다.
이러한 문제를 해결하기 위해 Gradle 7부터는 Gradle Version Catalog 기능이 도입되었습니다.
이 기능을 사용하면 버전 관리를 간소화하고 개발자들이 더욱 쉽게 라이브러리 및 플러그인 버전을 관리할 수 있습니다.
Nia 프로젝트에서도 사용이 되었고, 앞으로 작업하는 프로젝트에도 적용을 해보기 위해 이 글을 작성하였습니다.
기존에 버전관리는 2가지중 하나를 사용하고 있을 것입니다.
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.31")
첫 번째 방법의 문제점은 버전 관리가 어렵다는 것입니다. 하나의 파일에서 관리가 되는것이 아닌 각각의 build.gradle 파일에서 작성을 해주어야 하고, 반복되는 라이브러리들이 많아질 것 입니다.
이때 변경 사항이 생겨 적용을 하게 되는 과정이 번거로울 수 있습니다.
/buildSrc
object Dependency {
object Kotlin {
const val version = "1.5.31"
const val coroutine = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
}
}
/build.gradle
implementation(Dependency.Kotlin.coroutine)
두 번째 방법의 문제점은 빌드 시간이 느려질 수 있다는 것입니다. buildSrc의 상수를 변경하면 전체 그레들을 다시 빌드해야 하므로 빌드 시간이 늘어날 수 있습니다. 또한 모듈을 생성하려면 추가적인 노력이 필요하므로 단순히 버전 관리용으로는 적합하지 않습니다.
이 Gradle 버전 카탈로그는 이러한 문제를 해결하고 종속성 버전을 더 쉽게 관리할 수 있도록 합니다. 천천히 알아가보도록 하겠습니다
Gradle Version Catalog는 Toml 파일을 사용하여 버전 정보를 관리합니다. 해당 파일을 통해 버전 그룹을 정의하고, 각 그룹에서 사용 가능한 버전을 지정한다. Gradle은 이 파일을 읽어서 라이브러리와 플러그인의 버전을 찾아서 사용합니다.
이를 통해 버전 정보를 일관되게 관리할 수 있으며, 버전 충돌을 방지할 수 있습니다. 이러한 장점들은 빌드 시스템의 안정성과 유지보수성을 향상시키며, 빌드 프로세스를 간소화하고 개발자의 작업 효율을 높이는 데 도움을 줍니다.
dependencies {
implementation(libs.groovy.core)
}
위 코드는 Gradle Version Catalog 를 적용한 build.gradle 파일이며 해당 소스에서 libs 카탈로그를 나타내며 buildSrc 모듈과 동일한 방식으로 작성합니다.
buildSrc 보다 버전 카탈로그를 사용하는 이점 중 하나는 버전 카탈로그가 상수를 인라인하는 대신 함수 호출을 사용한다는 것입니다. 즉, 상수 값을 변경해도 모든 플러그인 코드의 재빌드가 트리거되지 않아 더 효율적일 수 있습니다.
여기서 상수 표현은 우리가 선언한 버전 또는 라이브러리 주소를 나타냅니다.
버전 카탈로그를 생성하려면 루트 gradle
디렉터리에 libs.versions.toml
파일을 생성하기만 하면 됩니다.
이제 파일을 작성해보도록 할텐데요 toml 파일은 4가지 영역으로 나뉩니다.
[version]: 이 섹션은 라이브러리 선언 섹션에서 사용할 수 있는 버전을 선언하는 데 사용됩니다.
[libraries]: 이 섹션은 라이브러리를 선언하는 데 사용됩니다.
[plugins]: 이 섹션은 Gradle 플러그인을 선언하는 데 사용됩니다.
[bundle]: 이 섹션은 번들을 선언하는 데 사용됩니다.
예를 들어 Firebase를 추가해 보겠습니다. 이전에는 다음과 같이 Gradle을 구성했을 수 있습니다.
implementation(platform("com.google.firebase:firebase-bom:31.2.0"))
implementation("com.google.firebase:firebase-auth-ktx")
implementation("com.google.firebase:firebase-firestore-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")
위 구성을 기반으로 toml 을 작성해보도록 하겠습니다.
[version]
firebase = "31.2.0"
[libraries]
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase" }
firebase-auth-ktx = { group = "com.google.firebase", name = "firebase-auth-ktx" }
firebase-firestore-ktx = { group = "com.google.firebase", name = "firebase-firestore-ktx" }
firebase-analytics-ktx = { group = "com.google.firebase", name = "firebase-analytics-ktx" }
[bundle]
firebaes = ["firebase-auth-ktx", "firebase-analytics-ktx", "firebase-firestore-ktx"]
파일을 작성했으니 이제 바로 build.gradle 로 가서 선언부만 수정해주면 됩니다.
implementation(libs.firebase.bom)
implementation(libs.firebase.auth.ktx)
implementation(libs.firebase.firestore.ktx)
implementation(libs.firebase.analytics.ktx)
이렇게 gradle version catalog 에 대해서 알아보았는데 확실히 기존보다 버전 관리가 편하고 무엇보다 타 프로젝트를 시작할때 toml 파일만 옮겨주면 매번 라이브러리 버전을 찾으러 다니지 않아도 되니 확실히 편한점이 있는거 같습니다.
nia 에서는 https://github.com/android/nowinandroid/blob/main/gradle/libs.versions.toml 다음과 같은 toml을 구성하고 있습니다. 해당 파일을 기준으로 내가 필요로 하는 라이브러리를 추가적으로 넣거나 아에 새로 생성해보는것도 좋을 것 같습니다.
그 외에 toml 을 자동으로 생성해주는 gitignore.io 같은 서비스도 생기면 좋을 것 같은? 바램 입니다.