LoginSignup
23
16

More than 5 years have passed since last update.

gradleでフラットなマルチプロジェクト

Posted at

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する宣言を書く。

settings.gradle
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を修正

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

参考

23
16
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
23
16