GradleのVersion catalogを使ったライブラリ管理

Photo by Aleksi Tappura on Unsplash

Gradle 7.0から導入された Version catalog を使ったライブラリ管理方法についてまとめておきます。

また、Gradle 7.2ではいくつか改善がされてるので、今回はGradle 7.2を使っていきます。

Gradleで使用するライブラリの依存関係を定義するときに、これまでもいろいろな方法がありました。例えば、extra propertiesを定義したり、buildSrcで定義したり、など。

これらの方法とは別に Version catalog という新しい方法を使うことができるようになりました。

Version catalogの定義

Version Catalogを使ってどのようにライブラリを管理するかを見ていきます。例として、androidxのviewmodelとlivedataを使う場合です。

settings.gradle に以下のように記述します。

次に使いたい箇所の build.gradle に以下のように書きます。

settings.gradle に定義したものを build.gradle で使うだけです。

少しややこしいのが、定義は lifecycle-viewmodel のようにハイフン区切りのものが、使用するときは、 lib.lifecycle.viewmodel のようにドット区切りに変わることです。

もう少し便利な使い方を見ていきます。

バージョンを定義する

先程の例では、同じバージョンを使用していましたが、こういう場合はバージョンを別に定義することで一箇所で管理することができます。

version というのでバージョンを定義できるので、それを versionRef として参照している感じです。

ライブラリをまとめて管理

よくあるケースとして、複数のライブラリを一緒に使用したい場合があります。こういった場合も Version catalog では管理することができます。

bundle を使って、複数のライブラリをまとめることができます。

これを build.gradle で以下のように使用することができ、複数のライブラリを一つのライブラリかのような依存定義で書けるようになります。

libs.bundles のあとに自分で定義した名前を書くことで使用できます。

この例だと一行で viewmodel と livedata が同時に依存関係に追加されます。

Pluginの管理

最後にPluginの管理についてです。Version catalog でPluginを管理するには行かようにします。

toPluginId でPluginのidを指定できます。さらに version または versionRef を使ってバージョンを指定します。

build.gradle では以下のように使用します。

plusings ブロックで alisas を使って指定します。

Tomlを使った定義

これまで見てきた方法は settings.gradle をにコードを書くような感じで定義していました。

Version catalog ではTomlで定義ファイルを作成することもできます。

以下に例を示します。Tomlファイルは gradle ディレクトリ直下に libs.versions.toml で配置することで自動で認識してくれます。

このように外部ファイルにて一元管理することができるようになります。

使うときは、 settings.gradle に定義したとき同じようにできます。

Tips

最後にVersion catalogを使用する際のTipsを紹介しておきます。

文字列として参照する

implementation 等で使用するのではなく、単純な文字列として参照する方法です。例えば、 composeOptions の指定などで使用する場合です。

get() で取得することで単純な文字列として扱えます。

BOMを扱う

BOMで提供されてるものを扱う方法です。

まず、TOML側です。

ポイントとしてはBOMでバージョンを指定してるので、 module のみを指定します。

使うときは以下のようになります。

pluginsブロックで参照できないPluginを使用したい場合

Hiltのような、Gradleの plugins ブロックで解決できないPluginを使用したい場合です。

だけだと、Hiltのプラグインは plugins で使用できるid名にはなっていないため見つからずにエラーになります。

こういう場合は settings.gradlepluginManagement に以下のように記述することで解決できます。

参考

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO