Slide 1

Slide 1 text

@MIXI shibuya.apk #50 2024.12.06 ConventionPluginを通して学ぶ Gradle Plugin入門 1

Slide 2

Slide 2 text

自己紹介 ● ばやすてぃー(髙林明日美) ■ X: @bayastea ● Androidエンジニア @株式会社MIXI ■ サロンスタッフ直接予約アプリ「minimo」開発

Slide 3

Slide 3 text

minimoについて

Slide 4

Slide 4 text

目次 ● Plugin概説 ○ Pluginの種類 ○ Custom Plugins ● Convention Plugins ○ 作成手順 ● まとめ

Slide 5

Slide 5 text

Plugin概説 - Pluginの種類 ● Core plugins ○ Gradleから提供されるPlugin ● Community plugins ○ Gradle Plugin Portal等から入手できる公開されたPlugin ● Custom plugins ○ 自分で作ったPlugin https://docs.gradle.org/current/userguide/plugins.html https://docs.gradle.org/current/userguide/plugins.html Gradle Plugin:ビルドプロセスを拡張・カスタマイズするためのもの

Slide 6

Slide 6 text

Plugin概説 - Custom plugins ● Script Plugin ○ プラグインは自動的にコンパイルされ、ビルドスクリプトのクラスパスに含まれる ○ 使用の際はapply from 構文を使う ○ 使用は非推奨 ● Precompiled Plugin ○ プラグインは自動的にコンパイルされ、テストされ、ビルドスクリプトのクラスパスで利用可能になる ○ 使用の際はplugins { } ブロックを使う ○ Kotlin DSLまたはGroovy DSLを用いてプラグインを作成する ● Binary Plugin ○ Plugin JARが作成され公開される ○ 使用する際はplugins{ } ブロックを使う ○ パフォーマンスや保守性は他の 2つよりも上 ○ 今回はこちらを使用 https://docs.gradle.org/current/userguide/plugins.html https://docs.gradle.org/current/userguide/custom_plugins.html#custom_plugins_2

Slide 7

Slide 7 text

Convention Plugin - 1 ● 複数のモジュールに共通するビルドロジックをカプセル化して作成したプラグインのこと ● ビルドロジックを共通化して各モジュールで使用することができるので、build.gradle内の記述量 を減らすことができる https://docs.gradle.org/current/userguide/sharing_build_logic_between_subprojects.html#sec:sharing_logic_via_convention_plugins

Slide 8

Slide 8 text

Convention Plugin - 2 ● buildSrc内で Convention Pluginを実装する やり方もあるが、buildSrcにはいくつか落とし 穴がある ■ ビルドのたびにコンパイル・テストが実行される  (Gradle8以降では多少改善) ■ 小さな変更がプロジェクト全体に影響を及ぼし、実行時 間が延びる ● 主流はComposite build + Convention Plugin ■ Now In AndroidもComposite buildを使用している ● Composite build = ビルドを含んだビルド ■ マルチモジュールのsubprojectsに似ているが、ビル ド全体を含んでいる点が異なる ● そのためComposite buildでは settings.gradleを追加する必要がある https://docs.gradle.org/current/userguide/composite_builds.html https://developer.squareup.com/blog/herding-elephants/#from-buildsrc-to-build-logic https://speakerdeck.com/mkeeda/5fen-defen-karubirudorozitukugong-tong-hua-nojin?slide=8

Slide 9

Slide 9 text

作成手順 1. モジュールを作る 2. settings.gradleの整備 ○ モジュール内のsettings.gradlePlugin実装 3. build.gradleに作成したPluginを登録 4. 使用側で呼び出す

Slide 10

Slide 10 text

モジュールの作成 build-logicモジュールを作成 ● Android Studioの 「New Module…」を使うといら ないファイルも生成されてしまうので、普通にディ レクトリを作る方が楽 https://github.com/android/nowinandroid/tree/fe4e8ec7c1b4438cda8d3cd7962ebc7b407f2263/build-logic

Slide 11

Slide 11 text

settings.gradleの整備 - モジュール内のsettings.gradle build-logic > settings.gradleに必要事項を記載 ● versionCatalogの設定 ○ プロジェクトのVersionCatalogを参 照したい場合は必要 ● 作成するディレクトリの定義 dependencyResolutionManagement { // versionCatalogの設定 versionCatalogs { create("libs") { from(files("/./gradle/libs.versions.toml")) } } } // 作成するディレクトリの定義 include(":convention")

Slide 12

Slide 12 text

settings.gradleの整備 - プロジェクト側のsettings.gradle root > settings.gradleで追加した モジュールを定義する ● pluginManagementブロックに書く必要 があるので注意 pluginManagement { includeBuild("build-logic") }

Slide 13

Slide 13 text

Pluginの実装 class TestPlugin : Plugin { override fun apply(target: Project) { println("convention plugin test!") } } Pluginインターフェースを継承し、apply関数の中に実装内容を書いていく

Slide 14

Slide 14 text

build.gradleに作成したPluginを登録 (前略) gradlePlugin { plugins { // 作成したPluginを登録する register("TestPlugin") { // PluginのIDを定義 id = "test.convention" // Pluginを実装したクラスを記載 implementationClass = "TestPlugin" } } } 作成したプラグインを登録する build-logic > convention > build.gradle.kts

Slide 15

Slide 15 text

使用側で呼び出す plugins { id("test.convention") } build-logic > convention > build.gradle にて定義したIDを記載することで Convention Pluginが利用可能 使用したいモジュール > build.gradle.kts

Slide 16

Slide 16 text

実行結果 > Configure project : convention plugin test!

Slide 17

Slide 17 text

まとめ ● Gradle Pluginは自分で作ることができる ● Convention Pluginを使うとbuild.gradle内の記述を共通化することができる ● Convention Pluginを実装する場合はComposite buildを使うのが主流 ● Composite build + Convention Pluginで作成する際は下記の手順で行う ■ モジュールを作る ■ settings.gradleの整備 ■ build.gradleに作成したPluginを登録 ■ 使用側で呼び出す

Slide 18

Slide 18 text

@MIXI