[Android] VersionCatalogのすゝめ

AndroidのJetpackCompose関係の記事のサムネイル

version catalogとは

VersionCatalogはGradleビルドシステムで使用される依存関係とバージョンを一括管理ができる仕組みです。

Grade 7.6から正式に導入されました

便利なところ

  • 依存関係、バージョンを一括管理できる
  • 関係のあるライブラリを1つにまとめることができる
  • 使い方が簡単

もちろん、モジュールによって依存するライブラリやプラグインのバージョンを変えたい場合にも対応できます。

versions.catalog.tomlファイルはどこでリンクしているのかと思ったら、自動で探して使えるようにしてくれるらしい

使い方

従来の依存関係の書き方では、各モジュールのbuild.gradle.ktsに直接記述していましたが、VersionCatalogを使用すると、libs.versions.tomlに依存関係をまとめて記述できます。

今回は、以下のbuild.gradle.ktslibs.versions.tomlを使った方式に変換していくことでVersionCatalogの有用性を解説していこうと思います。

従来の書き方

build.gradle.kts
plugins {
    id("com.android.application") version "7.2.0" apply false
    id("org.jetbrains.kotlin.android") version "1.6.10" apply false
}

// 省略.....

dependencies {
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.4.1")
    implementation("androidx.recyclerview:recyclerview:1.2.1")
    implementation("androidx.room:room-runtime:2.4.2")
    kapt("androidx.room:room-compiler:2.4.2")
    implementation("androidx.room:room-ktx:2.4.2")
    // その他の依存関係...
}

VersionCatalogでは、以下の4つのを定義できるので、順番に使い方を解説していきます。(versionsについては、単純な定義だけなので省略します)

  1. [versions] : ライブラリ、プラグインのバージョンを定義する(文字列)
  2. [libraries] : ライブラリの依存関係を定義する
  3. [bundle] : [libraries]で定義したライブラリをまとめて1つの Alias にする
  4. [plugins] : プラグインの依存関係を定義する

Libraries

最初に記載した、従来のbuild.gradle.ktsを使用した方法から、VersionCatalogを使った方法に「ライブラリ依存関係」部分を書き換えると、libs.versions.tomlファイルに以下のように記述します。

libs.versions.toml
[versions]
ktx = "1.9.0"

[libraries]
androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "ktx" }

書き換えたバージョンをbuild.gradle.ktsで使うと以下のように、「libs.」内に自動的にVersionCatalog側で定義した変数が生成されるので、libs.定義した変数名のように宣言します。

build.gradle.kts(Module:)
dependencies {
   implementation(libs.androidx.ktx)
}

Bundles

この機能はVersionCatalogから追加された機能で、「ライブラリのセット」を定義できる機能です。

今回の例だと、「Room」の機能がセットにしたほうが定義しやすそうなので、セットにするためにlibs.versions.tomlファイルに以下のように記述します。

libs.versions.toml
[libraries]
// ....
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }

[bundles]
androidx-room-bundle = ["androidx-room-runtime", "androidx-room-ktx"]

compilerについては、kpatで使用するのでセットにしていません。

書き換えたバージョンをbuild.gradle.ktsで使うと以下のように、「libs.bundles」内に自動的にVersionCatalog側で定義した変数が生成されるので、libs.bundles.定義した変数名のように宣言します。

build.gradle.kts
dependencies {
    implementation(libs.bundles.androidx.room.bundle)
    kapt(libs.androidx.room.compiler)
    // その他の依存関係...
}

Plugins

最初に記載した、従来のbuild.gradle.ktsを使用した方法から、VersionCatalogを使った方法に「プラグイン依存関係」部分を書き換えると、libs.versions.tomlファイルに以下のように記述します。

libs.versions.toml
[versions]
android = "7.2.0"
kotlin = "1.6.10"

[plugins]
android = { id = "com.android.application", version = "android" }
kotlin = { id = "org.jetbrains.kotlin.android",version = "kotlin" }

書き換えたバージョンをbuild.gradle.ktsで使うと以下のように、「libs.plugins」内に自動的にVersionCatalog側で定義した変数が生成されるので、libs.plugins.定義した変数名のように宣言します。

build.gradle.kts
plugins {
   id(libs.plugins.android)
   id(libs.plugins.kotlin)
}

注意点

「-」を含む変数を定義した場合は、build.gradle.kts内で使用するときに、「-」の部分が「.」に置き換わります。
「androidx-ktx」の場合は、「androidx.ktx」となります。

「libs.」と入力した時点でVersionCatalogに定義した変数が補完候補に出てこない場合、コンパイルができていない可能性があるので、libs.versions.tomlを記述した時点で一度Syncをしてみてください

まとめ

従来の書き方では、各モジュールでプラグインやライブラリのバージョンを個別に管理する必要がありましたが、VersionCatalogを使用することで、これらを一元管理でき、プロジェクト全体の管理が簡素化されます。

特に、複数のライブラリをバンドルにまとめることで、依存関係の追加や管理がより効率的になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です