プラグインや依存関係をプロジェクトレベル・モジュールレベルのbuild.gradleにそれぞれハードコーディングしていたのを、Tomlファイルのバージョンカタログに移行する作業を行いました。
作業が面倒なだけで簡単にいくと思っていたのですが、意外にも躓いてしまったので備忘録として残しておきます。
手順は公式のドキュメントに従って行いました。
またNowInAndroidの書き方も参考にしました。
1. バージョンファイル名を間違えた
最初から些細なことですが、libs.versions.toml
とするところをlibs.version.toml
としてしまっていました。
Gradle は、デフォルトで libs.versions.toml ファイルでカタログを検索するため、このデフォルト名を使用することをおすすめします。
とあるように、デフォルトの名前から変えないように気をつけましょう。
2. 単純に書き方がよくわからないところがあった
NowInAndroidではtomlファイルにversion.refを指定していない箇所がありました。
どうやらBOMを使用している箇所だったようで、その場合バージョン番号を書かなくても良いようです。
既存のbuild.gradleの書き方でも指定しなくても良いとはいえ、移行するとなると戸惑いました。
以下はFirebaseのBOMの例です。
firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics" }
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" }
firebase-cloud-messaging = { group = "com.google.firebase", name = "firebase-messaging" }
firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics" }
firebase-performance = { group = "com.google.firebase", name = "firebase-perf" }
firebase-performance-gradle = { group = "com.google.firebase", name = "perf-plugin", version.ref = "firebasePerfPlugin" }
ComposeのBOMでも同じように、BOMのバージョンさえ指定していればOKだと公式に書いてありました。
BOM をバージョン カタログと一緒に使用できますか?
はい。BOM 自体をバージョン カタログに含めると、他の Compose ライブラリ バージョンを省略できます。
[libraries]
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" }
androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
3. Sync・ビルドエラーが思ったより出た
settings.gradleに特に設定は要らなかった
色々調べながらやっていたら、見つけた資料の中に以下のようなものがあったため、settings.gradleに追加していました。
versionCatalogs {
libs {
from(files("../gradle/libs.versions.toml"))
}
}
すると以下のエラーに。
org.gradle.api.InvalidUserDataException: Invalid catalog definition:
- Problem: In version catalog libs, you can only call the 'from' method a single time.
どうもfromが複数回呼ばれているという内容のようでしたが、fromはこの1箇所のみのはず。。。
別の書き方でenableFeaturePreview('VERSION_CATALOGS')
というのがあったのでそちらも試してみましたがうまくいかず。
とりあえず放置して他の作業を進めていたら、settings.gradleに特に何もしなくてもビルドが通りましたw
Gradle は、デフォルトで libs.versions.toml ファイルでカタログを検索するため、このデフォルト名を使用することをおすすめします。
またまたこの引用ですが、どうやらGradle側で上手いことやってくれるみたいです。
Gradle8.0以降ではデフォルトでバージョンカタログが有効になっているとのことなので、そのおかげかも。
トップレベルとモジュールレベルのプラグイン齟齬
トップレベルのbuild.gradleとモジュールレベルのbuild.gradle(この時点でappモジュール単一です)が完全一致していなかったので、
org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'xxx', version: 'x.x.x']
のように。この機会にプラグインを見直しました。
syncが通ってからビルドエラーでタイポに気付く。
tomlファイルのnameで指定している部分については、syncが通った後にビルドエラーで間違いを指摘されます。
依存関係はどんどん増えていくものなので、早めに移行作業をしておかないとこういったタイポなどがなかなか苦しいです。
まとめ
思ったより手こずってしまったので、これからはやろうと思ったら早めにやろうと思いました。
マルチモジュール化するしないに関わらず、後の管理が楽になります。