タクシーアプリ『GO』のAndroidアプリを開発している山本です。 Androidアプリ開発に必要なライブラリの定義方法をGradleのVersionCatalogに乗り換えるときに調べたことと利点を紹介します。
Androidのビルドツールとして採用されているGradleには、アプリで使用するライブラリやアプリ開発用の拡張機能などの依存関係を定義しています。
依存関係の管理は大規模なアプリになるほど複雑になります。 具体的には地図表示や通信、カメラ撮影などのアプリ機能を実現するためにライブラリや拡張機能が必要になります。 さらに複雑なアプリ機能をモジュールごとに分割して構造化すると、モジュールごとに必要な依存関係の種類やバージョンの定義が必要になります。
この複雑になりがちな依存関係を定義する方法として新しくGradleに導入されたVersionCatalogを『GO』のAndroidアプリで使用しました。
『GO』のAndroidアプリでは50以上のモジュールで使用する依存関係を1つのGradleファイル gradle/deps.gradle にまとめて定義していました。
Groovyの変数として定義することで、各モジュールで同じライブラリとバージョンに揃えることができます。また各モジュールから参照する場合にライブラリの種類がわかりやすいように、構造化して定義することもできます。
// gradle/deps.gradle
ext.deps = [:]
def deps = [:]
def moshi = [:]
def moshiVersion = '1.14.0'
moshi.core = "com.squareup.moshi:moshi:$moshiVersion"
moshi.adapter = "com.squareup.moshi:moshi-adapters:$moshiVersion"
moshi.kotlin = "com.squareup.moshi:moshi-kotlin:$moshiVersion"
moshi.codegen = "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
deps.moshi = moshi
ext.deps = deps
各モジュールでは定義済みの変数から必要な依存関係を参照します。
// feature-foo/build.gradle
// ライブラリやバージョンが定義されたGradleファイルを参照
apply from: rootProject.file('gradle/deps.gradle')
dependencies {
implementation deps.moshi.core
implementation deps.moshi.kotlin
implementation deps.moshi.adapter
kapt deps.moshi.codegen
}
既存のGradleファイル gradle/deps.gradle をもとにVersionCatalogを定義します。Gradleのバージョン7.0から試験運用版、バージョン7.4から安定版として使用できます。
TOMLファイルにバージョン、ライブラリ、バンドル、プラグインのセクションごとに依存関係をそれぞれ定義します。ライブラリを使用するために複数まとめて定義する必要がある場合、ライブラリをまとめたバンドルとして定義することができます。 VersionCatalogの名前にはセパレータとして -, _, . が利用でき、参照する場合は . に置き換えられます。
# gradle/libs.versions.toml
[versions]
moshi-version = '1.14.0'
[libraries]
moshi-core = { module = 'com.squareup.moshi:moshi', version.ref = 'moshi-version' }
moshi-adapter = { module = 'com.squareup.moshi:moshi-adapters', version.ref = 'moshi-version' }
moshi-kotlin = { module = 'com.squareup.moshi:moshi-kotlin', version.ref = 'moshi-version' }
moshi-codegen = { module = 'com.squareup.moshi:moshi-kotlin-codegen', version.ref = 'moshi-version' }
[bundles]
moshi = [
'moshi-core',
'moshi-adapter',
'moshi-kotlin',
]
モジュールごとにVersionCatalogに定義された依存関係を参照します。これまでの方法ではライブラリを個別に定義していた依存関係をバンドルを参照する1行にまとめることができます。
// feature-foo/build.gradle
dependencies {
implementation libs.bundles.moshi
kapt libs.moshi.codegen
}
これまでの依存関係の定義方法はあくまでGroovyの言語機能のため、良くも悪くも様々な書き方ができます。Gradleの機能として提供されるVersionCatalogを使うことで依存関係の定義方法を迷わずに済み、はじめて依存関係を確認するメンバーにもわかりやすくなります。
また複数の依存関係定義をBundleにまとめるため、モジュールが増えた場合の依存関係の抜け漏れを防ぎ、ライブラリが増減した場合の影響範囲をおさえることができます。
GitHub Dependabotを利用できる場合は、VersionCatalogに定義している依存関係をもとにアップデートがあるか確認できます。アップデート可能な依存関係を自動でリストアップできるため、依存関係を最新の状態に保ちやすくなります。
Sharing dependency versions between projects | Gradle https://docs.gradle.org/current/userguide/platforms.html
Dependabot version updates keeps Gradle version catalogs up-to-date | GitHub https://github.blog/changelog/2023-03-13-dependabot-version-updates-keeps-gradle-version-catalogs-up-to-date/
興味のある方は 採用ページ も見ていただけると嬉しいです。
Twitter @goinc_techtalk のフォローもよろしくお願いします!