toml 파일이란 무엇인가?
TOML(Tom's Obvious, Minimal Language)은 GitHub의 공동 창립자인 Tom Preston-Werner가 만든 파일 형식으로, 이름 그대로, 간결하면서도 읽기 쉬운 파일 형식이다. 일반적으로 키-값쌍으로 값들을 관리하며, 하나의 파일로 여러 프로젝트의 버전 관리를 통합하는데 사용될 수 있다.
그동안 안드로이드에서는 주로 buildSrc를 사용해 버전 관리를 해왔는데, 최근 toml이 매우 활성화되기 시작해 이번 글에서 다뤄보고자 한다.
*Android Developers 에서도 공식적으로 Version Catalog로 이전 이라는 명칭으로, toml 파일을 사용하는 방법을 설명하고 있으며, Android Gradle Plugin(AGP) 버전 7.4부터는 자동적으로 toml 파일에 대한 읽기를 지원한다.
toml 파일 작성법
toml 파일 작성시에는 두가지만 기억하면 된다.
- 첫째는 대괄호([]) 로 묶이는 Table이다. Table은 하위에 있는 키-값 쌍을 하나의 테이블로 묶는 역할을 한다.
- 둘째는 키-값 쌍이다. 키 = 값 으로 표현되며, 예를 들어 만약 kotlin 키에 대한 값을 "1.9.20" 으로 설정하고 싶다면 "1.9.20" 으로 쓰면 된다.
- 셋째는 중괄호({})로 묶이는 Inline Table이다. 만약 키-값 쌍의 값에 Table이 들어가야 한다면 {}
이 두가지를 사용해 gradle을 위한 toml 파일을 다음과 같이 만들 수 있다.
[versions]
agp = "8.2.1"
kotlin = "1.9.20"
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
이 toml 파일에는 총 3개의 Table이 있으며, versions 테이블에는 version에 대한 키-값 쌍이 있고, libraries에는 build.gradle.kts 파일의 dependencies 블록에 들어갈 의존성이 Inline Table 형태로 들어가 있으며, plugins 테이블에는 build.gradle.kts의 plugin 블록에 들어갈 의존성이 Inline Table 형태로 들어가 있다.
만든 toml 파일 프로젝트에 넣기
이렇게 만든 toml 파일은 gradle 폴더 하위에 libs.versions.toml 파일로 넣으면 된다.
만약 AGP 7.4 이후 버전에서는 자동으로 파일을 인식해서 프로젝트의 build.gradle.kts 파일에서 사용할 수 있게 된다.
다른 이름의 파일을 버전 카탈로그에 추가하고 싶다면
먼저 toml 파일을 만든 후
settings.gradle.kts 파일에 다음과 같이 추가하면 된다.
dependencyResolutionManagement {
...
versionCatalogs {
create("libv2") {
from(files("gradle/libs.versionsv2.toml"))
}
}
}
그러면 gradle/libs.versionsv2.toml 파일이 버전 카탈로그로 추가된다.
추가된 버전 카탈로그 사용하기
추가된 버전 카탈로그는 변수로 접근할 수 있다. 기본적으로 libs.versions.toml 파일은 settings.gradle.kts의 create 함수를 통해 libs 변수로 접근할 수 있게 된다.
[versions]
agp = "8.2.1"
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
따라서 libs를 통해 파일에 접근하고, plugins 변수를 통해 다시 테이블에 접근한다음 androidApplication 키값에 접근하면, 해당 값이 androidApplication plugin에 대한 의존성이 설정된다.
plugins {
alias(libs.plugins.androidApplication)
}
libraries 블록에 있는 것은 최상위 테이블(libs) 하위에 생성되며 '-' 를 구분자로 변수처럼 접근할 수 있다.
[versions]
kotlin = "1.9.20"
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
따라서 다음과 같이 접근할 수 있다.
dependencies {
implementation(libs.kotlin.test)
}