📚

【Android】ライブラリ管理に version catalog を導入する

2023/03/14に公開

version catalog について

ライブラリのバージョンを一元管理する方法としてextブロックに記述したり外部ファイルに書き出す方法がありましたが、標準的な方法がなかったためGradle 7.0で実験的に導入された機能。

settings.gradleTomlファイルでライブラリを管理します。

Gradle Release Notes

開発環境

Android Studio Flamingo | 2022.2.1 Beta 5
Kotlin: 1.6.21
Gradle: 7.2.0

初期設定

settings.gradle に実装する方法もありますが、今回はTomlファイルを使う方法で実装したいと思います。

1. version catalog を有効にする

settings.gradleに以下を追記して、version catalogを使用できるようにします。

settings.gradle

enableFeaturePreview('VERSION_CATALOGS')

2. Toml ファイルを作成する

プロジェクト直下のgradleディレクトリにlibs.versions.tomlを作成します。

これでlibs.versions.tomlに記述したバージョンやライブラリをGradleが読み取るようになります。

libs.versions.toml について

セクション

libs.versions.tomlで使用するセクションは以下の4つ

  • [versions]: バージョンを定義
  • [libraries]: ライブラリを定義
  • [bundles]: [libraries]で定義したライブラリをまとめて1つの Alias にする
  • [plugins]: プラグインを定義

Alias の命名

  • - _ . のどれかで区切られた識別子で構成する
  • Alias を参照するとき、- _ .. に変換される(android-material > android.material
  • セットできる値は文字列のみ

Aliases and their mapping to type safe accessors

使い方

libs.versions.tomlに定義した Alias を参照するときは、プレフィックスにlibsをつける必要があります。

(今回[plugins]は使用していないので、割愛します!)

Versions

Intにする必要がある値はget().toInteger()で変換します。

[versions]
compileSdk = "32"
buildTools = "30.0.3"
android {
    compileSdkVersion libs.versions.compileSdk.get().toInteger()
    buildToolsVersion libs.versions.buildTools.get()
}

libraries

[libraries]
android-material = "com.google.android.material:material:1.8.0"
dependencies {
    implementation(libs.android.material)
}

バージョンを共有する場合

[versions]
compose = "1.1.1"

[libraries]
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" }

Firebase の bom を使用する場合

[libraries]
firebase-bom = "com.google.firebase:firebase-bom:26.2.0"
firebase-analytics-ktx = { module = "com.google.firebase:firebase-analytics-ktx" }
dependencies {
    implementation platform(libs.firebase.bom)
    implementation(libs.firebase.analytics.ktx)
}

bundles

bundlesセクションでは、セットで使うライブラリをまとめて1つの Alias にすることができます。

[versions]
compose = "1.1.1"

[libraries]
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" }

[bundles]
compose-ui = ["androidx-compose-ui", "androidx-compose-ui-tooling-preview"]
dependencies {
    implementation(libs.bundles.compose.ui)
}

使ってみた感想

良かったところ

  • バージョン/ライブラリをまとめて管理できていい。Tomlも簡単なので理解しやすい。
  • bundlesでライブラリをまとめれるので、必要なライブラリを都度気にする必要がなくなって良さそう
  • dependenciesがスッキリする

悩んだ/気になったところ

  • Alias 名をどうしようか悩んだ
    • versionCode or version-code
    • androidx-compose-ui or compose-ui or androidx-composeUi
    • leakcanary or debug-leakcanary(プレフィックスに用途/機能を付けるか)
  • バージョンのアップデートが必要な時にTomlファイル上で Warning が出ないので気づきにくそう?
    • Renovate を使うとバージョンのアップデートを検知してくれるので大丈夫そう

Discussion