はじめに
モジュール分割することで、各機能の依存関係をクリーンに保つことができます。
ただ、モジュール分割されたものを正しく使わなければ、簡単に依存関係をゴチャついたものにできたりもします。
例えば :module1
と :module2
があり、本来の設計思想として両者が依存しないようにしたいのに、下記の1行を追加することで簡単に :module1
から :module2
への依存関係を作り出すことが出来てしまいます。
implementation project(":module2")
それを防ぐためには、設計思想を開発者全体に行き渡らせ、意識することが大切になってきますが、そもそも間違った依存関係を作り出せないようにできたらそれに越したことはありません。
Module Graph Assert
モジュールの依存関係にルールを作ることができるプラグインです。
ざっくり説明すると
- ホワイトリスト方式・ブラックリスト方式で、モジュール毎の依存関係を定義可能(
allowed
restricted
)- 許可してない依存関係を作った場合にエラーになる
- 正規表現で書ける
という感じです。
今回は触れませんが、依存関係の階層の高さ(深さ?)へのルールも指定できるようです。( maxHeight
)
使ってみる
:app
モジュールと :module1
:module2
のモジュールがあり、
-
:app
→:module1
と:module2
の依存は OK -
:module1
→:module2
、:module2
→:module1
の依存は NG
としたい場合を想定します。
プラグインを追加する
build.gradle
app/build.gradle
にそれぞれ追加します。
plugins {
id "com.jraska.module.graph.assertion" version "2.3.0"
}
plugins {
...
id 'com.jraska.module.graph.assertion'
}
定義を記述する
app/build.gradle
moduleGraphAssert {
restricted = [':module.* -X> :module.*'] // ①
assertOnAnyBuild = true // ②
}
① restricted
ブラックリスト方式で restricted
に禁止したい依存関係を定義しています。
正規表現も記述可能なので :module1
:module2
相互の依存が禁止されるようになっています。
② assertOnAnyBuild
ルールのチェックタイミングの指定です。
モジュール数が多くないプロジェクトで試したところ、チェック自体は軽量な処理のようだったので true
で指定しています。
※ 下記のようにホワイトリスト方式でも書くことも可能です。
moduleGraphAssert {
allowed = [':app -> :module.*']
assertOnAnyBuild = true
}
試しにルール違反してみる
ルールで禁止している :module1
→ :module2
への依存を定義してみます。
implementation project(":module2")
この状態で「Sync」してみると…
Dependency '':module1' -> ':module2' violates: ':module.* -X> :module.*'
* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Exception is:
org.gradle.api.GradleException: Dependency '':module1' -> ':module2' violates: ':module.* -X> :module.*'
at com.jraska.module.graph.assertion.RestrictedDependenciesAssert.assert(RestrictedDependenciesAssert.kt:23)
at com.jraska.module.graph.assertion.ModuleGraphAssertionsPlugin.runAssertionsDirectly(ModuleGraphAssertionsPlugin.kt:78)
at com.jraska.module.graph.assertion.ModuleGraphAssertionsPlugin.apply$lambda-1$lambda-0
ビルドエラーになりました。
まとめ
モジュールの依存関係にルールを作ることができるプラグイン modules-graph-assert を紹介しました。
この記事では紹介していない機能もありますので、ぜひご参照ください。
ルールを定義し、マルチモジュールプロジェクトを健全に保ったまま素敵なアプリを作っていきたいですね。