gradle で共通の設定をまとめる

バージョン

  • 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 の場合でもそのままコピペして共通化できるようになった(らしい。確認したことはない)。

その他巨大なプロジェクトの場合の構成例についてのユーザガイドがある。

Structuring Large Projects

その他情報

歴史

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 から見えるようになった

リンク

*1: Gradle Kotlin DSL Primer

*2: Organizing Gradle Projects

*3: Gradle Kotlin DSL Primer

*4: Using Gradle Plugins

*5:gradle 6.8 で gradle init すると下記のサンプルのような project が出力され、このリンクも表示される。https://docs.gradle.org/6.8/samples/sample_building_kotlin_applications_multi_project.html