5
4

More than 1 year has passed since last update.

【Android】Module Graph Assert プラグインでマルチモジュールを健全に保つ

Posted at

はじめに

モジュール分割することで、各機能の依存関係をクリーンに保つことができます。

ただ、モジュール分割されたものを正しく使わなければ、簡単に依存関係をゴチャついたものにできたりもします。
例えば :module1:module2 があり、本来の設計思想として両者が依存しないようにしたいのに、下記の1行を追加することで簡単に :module1 から :module2 への依存関係を作り出すことが出来てしまいます。

module1/build.gradle
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 にそれぞれ追加します。

build.gradle
plugins {
    id "com.jraska.module.graph.assertion" version "2.3.0"
}
app/build.gradle
plugins {
    ...
    id 'com.jraska.module.graph.assertion'
}

定義を記述する

app/build.gradle

app/build.gradle
moduleGraphAssert {
    restricted = [':module.* -X> :module.*'] // ①
    assertOnAnyBuild = true // ②
}

restricted

ブラックリスト方式で restricted に禁止したい依存関係を定義しています。
正規表現も記述可能なので :module1 :module2 相互の依存が禁止されるようになっています。

assertOnAnyBuild

ルールのチェックタイミングの指定です。
モジュール数が多くないプロジェクトで試したところ、チェック自体は軽量な処理のようだったので true で指定しています。

※ 下記のようにホワイトリスト方式でも書くことも可能です。

moduleGraphAssert {
    allowed = [':app -> :module.*']
    assertOnAnyBuild = true
}

試しにルール違反してみる

ルールで禁止している :module1:module2 への依存を定義してみます。

module1/build.gradle
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

ビルドエラーになりました。 :police_car:

まとめ

モジュールの依存関係にルールを作ることができるプラグイン modules-graph-assert を紹介しました。
この記事では紹介していない機能もありますので、ぜひご参照ください。

ルールを定義し、マルチモジュールプロジェクトを健全に保ったまま素敵なアプリを作っていきたいですね。

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4