0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-10-19

はじめに

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

Gradleのマルチプロジェクトとは

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

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

基本構成

以下が基本的なマルチプロジェクトの構成
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を使いこなせるようになりたい!!
アドバイス、ご指摘等いただけると幸いです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?