MonorepoでGradleのマルチプロジェクト設定

# はじめに
PJでGradleの設定を色々いじる機会があったので復習がてら整理。
今のPJに入るまでMavenは色々いじったことがあったけど、Gradleに関してはコマンドでの実行ぐらいしかしたことがなかったぐらいのレベル感です。

# Gradleのマルチプロジェクトとは
元になる1つのプロジェクトと、そのPJ内で依存関係を持った１つ以上のサブプロジェクトを用意して管理できる構成のこと。  

全体でのビルドや、サブプロジェクトを個別にビルドしたり、サブプロジェクト内のタスクも個別で実行できる。

## 基本構成
以下が基本的なマルチプロジェクトの構成
root-pojectのディレクトリ配下にsettings.gradleと、各サブプロジェクトのディレクトリ配下にbuild.gradleを配置する
```
root-poject
├── .gradle
│   └── ⋮
├── gradle
│   ├── libs.version.toml
│   └── wrapper
├── gradlew
├── gradlew.bat
├── settings.gradle
├── project-a
│   ├── src
│   └── build.gradle
├── project-b
│   ├── src
│   └── build.gradle
└── project-c
    ├── src
    └── build.gradle
```
## マルチプロジェクト設定方法
マルチプロジェクトを設定するため、settings.gradleでルートプロジェクトを定義し、どのディレクトリ配下をサブプロジェクトとして定義するかを記述する必要がある。


```root-project/settings.gradle
rootProject.name = "root-poject"  //ルートプロジェクトの定義

include('project-a')              //サブプロジェクトの定義                     
include('project-b')
include('project-c')
```
includeメソッドの引数には、ディレクトリの名前を指定すれば良い。

# サブプロジェクト間の依存関係の定義
project-aでproject-bのclassをimportしたいとき、project-aのbuild.gradleに以下のような依存関係の指定を行う
 

```root-project/project-a/build.gradle
***

dependencies {
	implementation project(":project-c")
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

***
```
# Monorepoへのマルチプロジェクトの設定
Monorepoを採用しているPJで、マルチプロジェクトを設定をした
## 環境
- Java : 21
- Gradle : 8.5
- Spring Boot : 3.3.0
- IDE : Visual Studio Code

## 構成
以下が参画しているPJの構成
各サブプロジェクトのディレクトリ配下に、frontendとapiとディレクトリが分かれている

```
root-poject
├── .gradle
│   └── ⋮
├── gradle
│   ├── libs.version.toml
│   └── wrapper
├── ⋮ 
├── gradlew
├── gradlew.bat
├── settings.gradle
├── project-a
│   ├── frontend
│   └── api
|       ├── src
|       └── build.gradle        
├── project-b
│   ├── frontend
│   └── api
|       ├── src
|       └── build.gradle      
└── project-c
    ├── frontend
    └── api
        ├── src
        └── build.gradle
```
##  Monorepoでの設定方法
各サブプロジェクトのapi配下をサブプロジェクトの中身に指定したかったので、settings.gradleは以下のように記載し、論理名を保ちながら中身はapi配下になるように設定した。  


```roo-project/settings.gradle
rootProject.name = "root-poject"

include('project-a')
project(':project-a').projectDir = file('./project-a/api')        

include('project-b')
project(':project-b').projectDir = file('./project-b/api')  
     
include('project-c')
project(':project-c').projectDir = file('./project-c/api')       
```
## 困ったこと
ローカルでアプリを実行する際、vscodeのpluginであるSpring Boot Dashboardを使用していた。  
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-boot-dashboard

 Spring Boot Dashboardで認識されるプロジェクトの論理名はプロジェクトの中身のディレクトリ名をappとして認識するため、appsにはapi,api_,api__,という感じに表示されdashboardで実行する際に見分けがつかないという問題が発生した。

### 解決策
ディレクトリの名前を変えるしかないのかなあと今は思っています、、  

下記のようにディレクトリ名を変えると、Dashboardで区別ができ、任意のPJを実行することができるようにはなった。  
他にいい方法ないかな、てかありそうとは思っていますが調査中です。
```
・・・
├── project-a
│   ├── project-a-frontend
│   └── project-a-api
|       ├── src
|       └── build.gradle     
・・・
```

# 思ったこと
- Gradleはスクリプトベースで割と細かい設定ができるなあと思いました。(Mavenと比べて)
- ただディレクトリ名が割と肝になっていて、Monorepoを採用していると、構成によってはやりずらいこと、できないこともあるのかなと感じました。

# 参考
以下公式ドキュメントと、生成AIを使って調査しました。
https://docs.gradle.org/8.5/userguide/intro_multi_project_builds.html

# 最後に
もっとGradleを使いこなせるようになりたい！！
アドバイス、ご指摘等いただけると幸いです。