Gradleの基礎知識

# バージョン
Windows：10
Gradle：7.1

Gradleのリリースノートは[こちら](https://gradle.org/releases/)。

# ディレクトリ構成
ソースプロジェクトにおけるGradleの設定ファイルたちは、こんな構成で配置する。

```
├─ src                                     ・・・ソースコードディレクトリ
├─ gradle
│    └─ wrapper                            ・・・Gradle Wrapperの設定ディレクトリ
│         ├─ gradle-wrapper.jar            ・・・Gradle WrapperのJarファイル
│         └─ gradle-wrapper.properties     ・・・Gradle Wrapperの設定ファイル
├─ build.gradle                            ・・・ビルドの定義ファイル
├─ gradlew                                 ・・・Gradle Wrapper実行用スクリプト(UNIX用)
├─ gradlew.bat                             ・・・Gradle Wrapper実行用スクリプト(Windows用)
└─ settings.gradle                         ・・・Gradleの設定ファイル
```

# Gradle Wrapper
Gradleは特定のバージョンをインストールして使用することもできるが、[公式のガイド](https://docs.gradle.org/current/userguide/gradle_wrapper.html)にもある通りGradle Wrapperを使用するとインストール不要で簡単にバージョンの変更ができるためオススメ。

## バージョンの設定
`gradle-wrapper.properties` に定義する `distributionUrl` に、使用したいGradleのバージョンを指定する。

```
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
```

## Gradlew Wrapperの実行
以下のコマンドで実行できる。

* Windows

 ```
 ./gradlew.bat {タスク}
 ```

* UNIX

 ```
 ./gradlew {タスク}
 ```

## Gradleタスク
Gradleでは、デフォルトで用意されているタスクがある。
その中で、よく使用するものを挙げてみる。

| タスク名 | 用途 | 実行例 |
|:-:|:-:|:-:|
| build  | ソースコードのビルドを行う。<br>testタスクを内包しているため、デフォルトではtestタスクまで実行するが、`-x test`を付けて実行するとテストを行わない。<br>また、`--refresh-dependencies`を付けて実行すると、依存関係にあるライブラリをビルド時に取得し直す。 | `./gradlew.bat build`<br>`./gradlew.bat build -x test`<br>`./gradlew.bat build --refresh-dependencies`  |
| test  | ソースコードのテストを行う。<br>buildタスクに内包されているため、buildタスクを実行すると、自動的にtestタスクも実行される。  | `./gradlew.bat test`  |
| bootRun  | SpringBootのアプリケーションを起動する。  | `./gradlew.bat :{ソースプロジェクト名}:bootRun`  |
| clean  | buildタスクによって生成されたbuildディレクトリとその配下を削除する。  | `./gradlew.bat clean`  |

これらの他にも多くのタスクが存在する。
また、後述するbuild.gradleに独自のタスクを定義して実行することもできる。

# build.gradle
ビルドの定義を記載する。
Groovyのスクリプト形式。
ここでは、よく使用する設定を挙げる。

## pluginsブロック
Gradle単体ではビルドに必要な機能をほとんど備えていない。
そのため、必要な機能をPluginsブロックに定義して補う必要がある。
詳細は、[公式のガイド](https://docs.gradle.org/current/userguide/plugins.html)を参照。

## マルチプロジェクト
マルチプロジェクト構成では、親プロジェクトと子プロジェクトのそれぞれにbuild.gradleを配置する。
ここでは、マルチプロジェクト構成に関係するbuild.gradleの設定項目について挙げる。

### 親プロジェクトのbuild.gradle
#### allprojectsブロック
親プロジェクトに配置するbuild.gradleに記載する。
ソースプロジェクト全体の共通的な設定を記載するブロック。

#### subprojectsブロック
親プロジェクトに配置するbuild.gradleに記載する。
子プロジェクトに反映する設定を記載するブロック。

### 子プロジェクトのbuild.gradle
#### dependenciesブロック
ライブラリとの依存関係を定義する。
よく使用するメソッドの種類と違いは以下。

| メソッド名 | 特徴 | 備考 |
|:-:|:-:|:-:|
| compileOnly  | コンパイルクラスパスのみに依存関係を追加する。  | 非推奨とされている。  |
| runtimeOnly  | 実行時に使用できるように、ビルド出力だけに依存関係を追加する。  | 非推奨とされている。  |
| api  | 依存関係をコンパイルクラスパスとビルド出力に追加します。<br>依存関係が伝播する。  | -  |
| implementation  | 依存関係をコンパイルクラスパスに追加し、依存関係をビルド出力にパッケージ化する。<br>依存関係が伝播しない。  | -  |
| testImplementation  | テスト実行時のみ、依存関係をコンパイルクラスパスに追加する。  | -  |

詳細は[公式のガイド](https://docs.gradle.org/current/userguide/declaring_dependencies.html)を参照。

# settings.gradle
ビルドの対象とするソースプロジェクト名や、ライブラリ取得元リポジトリの情報を記載する。

* pluginManagement
ビルド時に外部ライブラリを取得する際に使用する。
ライブラリ取得元のリポジトリ情報を定義する。

* rootProject.name
大元となるソースプロジェクト名を定義する。
マルチプロジェクト構成では親プロジェクト名。

* include
マルチプロジェクト構成になっている場合に、ビルドの対象に含める子プロジェクト名を定義する。