バージョン
- Gradle 6.8
この記事の目的
gradle で共通の設定をまとめたい場合にとれる方法について列挙。 実際どれがいいかについては今の利用状況によるので何とも言えないのでそこまでは書かない。
内容
gradle の buildscript で記述を共通化したい
自分の gradle プロジェクトで multi-project を採用しており複数の project が存在するとき、 buildscript で何度もおなじようなことを書くことがよくあり、このあたりを共通化したい場合がある。
例えば java project で spring boot で開発してるので、 lombok gradle plugin と spring boot gradle plugin は毎回設定し、 annotationProcessor
configuration に spring-boot-annotation-processor を適用し、 implememtation
configuration に spring-boot-starter を追加している、などである。
この時取れる方法は以下の2つ。
- allprojects や subprojects に書いて project tree に対してまとめて書く
- plugin で書く
本家ドキュメントの記載を見ると下記の通り。
Sharing Build Logic between Subprojects
前者は cross project configuration と呼ばれており、 gradle のドキュメントでは良くない書き方とされている。 前述のリンク先には直接記述はないが kotlin DSL を使う場合でも問題があり、 type-safe accessor が動かなくなる。*1
後者は convention plugin と呼ばれており、gradle のドキュメントでは推奨された書き方となっている。
以下この convention plugin について考える。
Convention Plugin を書く
この convention plugin を開発するためにはどうすればいいかを考える。 gradle のドキュメントでは色々な場所に目的に合わせて色々書いてあってわかりにくいが、ここでの話ではそのプロジェクトにおける buildscript の共通化を目的としているので基本的には buildSrc 以下に置く 。*2 buildSrc 以下に置く場合でも開発方法としては以下の三種類がある。
- 通常の java/kotlin プロジェクトとして開発する
- script plugin として script を 直接 apply する形で利用されるもので開発する
- Precompiled Script plugin を利用して buildscript と同じような記述で開発する
通常の java/kotlin プロジェクトとして開発する
ドキュメント: https://docs.gradle.org/6.8/userguide/custom_plugins.html
昔からある方法で、たいていのプラグインはこの形で実装されている。 ただ簡単に共通化したいといった場合、すでにある buildscript から Plugin クラスを継承したりしないといけないためオーバーテクノロジー感がある。
script plugin として script を 直接 apply する形で利用されるもので開発する
https://docs.gradle.org/6.8/userguide/plugins.html#sec:script_plugins
こちらも昔からある方法で、普通に書いたbuildscript を抽出して共通化する簡単な方法の一つ。
制約
- 6.8 現在では script plugin で追加された configuration などは typesafe accessor として利用できない。*3
- 6.8 現在では plugins DSL を使って plugin を適用することができない。*4
Precompiled Script plugin を利用して buildscript と同じような記述で開発する
https://docs.gradle.org/6.8/userguide/custom_plugins.html#sec:precompiled_plugins
結果としてできるライブラリは1番目とほぼ同じだが記述方法とが buildscript と同じ書き方をそのまま利用できる。 最近の gradle init でできる初期構成などはこの方法も含まれている。 *5 このプラグインの書き方ができたときは kotlin DSL しか対応してなかったが最近になって groovy DSL も対応したようなので groovy の場合でもそのままコピペして共通化できるようになった(らしい。確認したことはない)。
その他巨大なプロジェクトの場合の構成例についてのユーザガイドがある。
その他情報
歴史
release note | |
---|---|
Gradle 4.10 Release Notes | 4.10 から kotlin DSL を使えるようになる。Get ready for Kotlin DSL 1.0 |
Gradle 5.0 Release Notes | 5.0 で stable Precompiled Script Plugin がサポート Release 1.0.4 · gradle/kotlin-dsl-samples · GitHub |
Gradle 6.4 Release Notes | 6.4 から groovy を使った precompiled script を利用できるようになった kts に書き換えなくても共通化できるようになった |
Gradle 6.7 Release Notes | 6.7 から composite build が buildSrc から見えるようになった |
リンク
- GRADLE-2475 Copy sysprop args to StartParameter for buildSrc build by rjernst · Pull Request #597 · gradle/gradle · GitHub
- https://docs.gradle.org/6.8/userguide/multi_project_configuration_and_execution.html#sec:decoupled_projects:
- サンプルコード https://docs.gradle.org/6.8/samples/#build_organization
- スクリプトの中では命令的な記述を避けるべきというガイド Best practices for authoring maintainable builds
*2: Organizing Gradle Projects
*5:gradle 6.8 で gradle init すると下記のサンプルのような project が出力され、このリンクも表示される。https://docs.gradle.org/6.8/samples/sample_building_kotlin_applications_multi_project.html