API, admin, frontみたいな複数プロジェクトをまとめてgradle対応化する際に、極力共通のdependencyとかスクリプトはまとめておきたいなーと思ってgradleのマルチプロジェクトにすることってあると思います。
Hierarchical layouts
/path/to/workspace
|-- RootProject
|-- build.gradle
|-- settings.gradle
|-- /API
|-- build.gradle
|-- /src
|-- /admin
|-- build.gradle
|-- /src
|-- /front
|-- build.gradle
|-- /src
このフォルダ構成で、RootProject/build.gradleには共通の設定を書いて、各プロジェクトのbuild.gradleには差分だけを書くのがDRYなかんじ。ちなみにsettings.gradleにはAPIなどをサブプロジェクトしてincludeする宣言を書く。
include ':API', ':admin', ':front'
で、ビルドする場合RootProjectに移動して
$ ./gradlew build
で全プロジェクトをビルド。個別プロジェクトをビルドする場合は
$ ./gradlew :API:build
ここまでは問題ないのだが、
今回、私が遭遇したのは、すでにAPI、admin、frontが個別にSubversionで管理されているパターンで、下記のような構成。
/Subversion/path
|-- /API
|-- branches
|-- tags
|-- trunk
|-- /admin
|-- branches
|-- tags
|-- trunk
|-- /front
|-- branches
|-- tags
|-- trunk
「さすがにこの構成を下記のように変更してしまう勇気がない!」そんなときに Flat layouts です。
/Subversion/path
|-- /RootProject
|-- branches
|-- tags
|-- trunk
|-- build.gradle
|-- settings.gradle
|-- /API
|-- /admin
|-- /front
Flat layouts
settings.gradleがあるRootProjectとサブプロジェクトを同階層に配置することができます。
その際、RootProject名をmaster
にしておくとgradleが自動でmaster
はRootProjectだと認識してくれます。
なのでディレクトリツリーは下記のようにして
/path/to/workspace
|-- /master
|-- build.gradle
|-- settings.gradle
|-- /API
|-- build.gradle
|-- /src
|-- /admin
|-- build.gradle
|-- /src
|-- /front
|-- build.gradle
|-- /src
settings.gradleを修正
includeFlat ':API', ':admin', ':front'
ちなみにこの状態で各サブプロジェクトをeclipseに読み込ませることで階層のときよりも見やすいプロジェクト構成になるかもしれません。
ビルドするときは各サブプロジェクトのフォルダで./gradlew build
とやって個別にビルドしたり階層時とかわりません。
このmaster
フォルダを別途Subversionにコミットすることで、現在のSCM構成を変更することなくgradleのマルチプロジェクト構成にできました。
/Subversion/path
|-- /master
|-- branches
|-- tags
|-- trunk
|-- /API
|-- branches
|-- tags
|-- trunk
|-- /admin
|-- branches
|-- tags
|-- trunk
|-- /front
|-- branches
|-- tags
|-- trunk