Gradle Version Catalog を試してみる

# implementation(libs.ktor.server.core) って記法は何？

Ktor を試してみようと思い[公式からサンプルをダウンロード](https://start.ktor.io/settings)したところ、build.gradle.kts に `implementation(libs.ktor.server.core)` のように依存関係が記載されてあった。
この表記方法を知らなかったため調べたところ [Version Catalog](https://docs.gradle.org/current/userguide/version_catalogs.html) を利用した表記とのことなので試してみた。

# Version Catalog を使用するメリット

バージョンを `gradle/libs.versions.toml` という一つのファイルで管理するため、一元管理ができる。
これは複数の build.gralde.kts が存在するような場合に便利。
gradle のドキュメントでは「依存関係の管理を簡素化できる」という記載もある。

# Version Catalog を使用した形に書き換える

Version Catalog を使用した形にするには `gradle/libs.versions.toml` で依存関係を記述し、build.gralde.kts では `libs.*` で参照する。
libs.versions.toml で定義するエイリアス名は `-`, `_`, `.` 区切りのどれでもよいが、build.gradle.kts で参照する際は `.` 区切りに統一される。
（参照）https://docs.gradle.org/current/userguide/version_catalogs.html#sec:mapping-aliases-to-accessors

```gradle:修正前の build.gradle.kts (一部抜粋)
plugins {
	kotlin("jvm") version "1.9.25"
	kotlin("plugin.spring") version "1.9.25"
	id("org.springframework.boot") version "3.4.4"
	id("io.spring.dependency-management") version "1.1.7"
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
    
	val lombokVersion = "1.18.22"
	compileOnly("org.projectlombok:lombok:$lombokVersion")
	annotationProcessor("org.projectlombok:lombok:$lombokVersion")
    
	testImplementation("org.springframework.boot:spring-boot-starter-test")
	testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
	testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.8.1")
    
	val kotlinxVersion = "1.8.1"
	implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxVersion")
	implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:$kotlinxVersion")
}
```
↓ Version Catalog を使用した形
```toml:gradle/libs.versions.toml
[versions]
# 依存関係のバージョンを記載する
# ここで記載した内容を version.ref で参照することができる
kotlin-version = "1.9.25"
kotlinx-version = "1.6.0"
spring-plugin-version = "1.9.25"
spring-boot-version = "3.4.4"
spring-dependency-management-version = "1.1.7"

[libraries]
# build.gradle.kts の dependencies に記載する依存関係のエイリアスを定義する
# バージョンは version.ref で上記 versions で定義した値を参照することもできるし、version で直接記載することもできる
spring-boot-starter = { group = "org.springframework.boot", name = "spring-boot-starter", version.ref = "spring-boot-version" }
spring-boot-starter-test = { group = "org.springframework.boot", name = "spring-boot-starter-test", version.ref = "spring-boot-version" }
lombok = { module = "org.projectlombok:lombok", version = "1.18.22" }
junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version = "1.8.1" }
kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin-version" }
kotlin-test-junit5 = { group = "org.jetbrains.kotlin", name = "kotlin-test-junit5", version.ref = "kotlin-version" }
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-version" }
kotlinx-coroutines-reactor = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-reactor", version.ref = "kotlinx-version" }

[plugins]
# build.gradle.kts の plugins に記載するプラグインのエイリアスを定義する
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-version" }
spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "spring-plugin-version" }
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot-version" }
spring-dependency-management = { id = "io.spring.dependency-management", version.ref = "spring-dependency-management-version" }
```

```gradle:build.gradle.kts (一部抜粋)
plugins {
	// plugins の参照は alias(libs.plugins.*)
	alias(libs.plugins.kotlin.jvm)
	alias(libs.plugins.spring)
	alias(libs.plugins.spring.boot)
	alias(libs.plugins.spring.dependency.management)
}

dependencies {
	// libraries の参照は libs.*
	implementation(libs.spring.boot.starter)
	implementation(libs.kotlin.reflect)
	compileOnly(libs.lombok)
	annotationProcessor(libs.lombok)
	testImplementation(libs.spring.boot.starter.test)
	testImplementation(libs.kotlin.test.junit5)
	testRuntimeOnly(libs.junit.platform.launcher)
	implementation(libs.kotlinx.coroutines.core)
	implementation(libs.kotlinx.coroutines.reactor)
}
```

# 所感

build.gradle.kts はかなりスッキリするように見える。
バージョンの変更についても libs.versions.toml を修正するだけで済むので良さそう。
ただ、build.gradle.kts が 1 つしかないのであれば Version Catalog を使用しない形のほうがシンプルで十分だと感じた。