Gradle公式ドキュメントを読む-Structuring Individual Builds(1)

#この記事について
Gradleをより理解するために公式ドキュメントを読んでメモ代わりとして私なりに訳していきます。
読んでいるドキュメントのバージョンは7.3.3です。
この記事で訳している章はStructuring Individual Builds>Creating a Basic Multi-Project Buildとなります。
必要な章から読んでいるため、一連の記事は公式ドキュメントの章立て通りの順にはなっていません。

##Structuring Individual Builds>Creating a Basic Multi-Project Build
###[Structuring and Building a Software Component with Gradle](https://docs.gradle.org/current/userguide/multi_project_builds.html#multi_project_builds)[^1]
[^1]: 公式でも目次の見出しと記事タイトルが一致していないのは良くないと思う

ある規模のソフトウェアをGradleでビルドする場合、2つの構造化の仕組みがあります。最初に、この章ではGradleマルチプロジェクトを使用したソフトウェアの構造化について説明します。このドキュメントでは、これを内部で構造化された単体のソフトウェアコンポーネントとして考えます。次に、ソフトウェアは個別のGradleビルドで表現されているソフトウェアコンポーネントの複合体であるソフトウェア製品として考えることが出来ます。これについての詳細な説明は[structuring software products with Gradle](https://docs.gradle.org/current/userguide/structuring_software_products.html#structure_large_projects)で行います。

###[Creating a multi-project build](https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:creating_multi_project_builds)
Gradleのマルチプロジェクトビルドはルートプロジェクトと任意の数のサブプロジェクトで成り立ちます。
基本的なマルチプロジェクトビルドはひとつのルートプロジェクトと単体のサブプロジェクトを含みます。これがappと呼ばれる単体プロジェクトを含むマルチプロジェクトの構造です。

```:プロジェクト構造
.
├── app
│   ...
│   └── build.gradle
└── settings.gradle
```

これが推奨されるGradleのプロジェクトの出発点です。build initプラグインも一つのルートプロジェクトに一つのサブプロジェクトの上記のようなスケルトンを生成します。
ルートプロジェクトはビルドファイルを持たず、サブプロジェクトを含めるための設定ファイルしか持っていないことに注意してください。

```gradle:settings.gradle
rootProject.name = 'basic-multiproject'
include 'app'
```

この場合、Gradleはappディレクトリにあるビルドファイルを検出します。
`gradle projects`コマンドを実行することで、マルチプロジェクトビルドの構造を見ることができます。

```shell-session
> gradle -q projects

------------------------------------------------------------
Root project 'basic-multiproject'
------------------------------------------------------------

Root project 'basic-multiproject'
\--- Project ':app'
```

*プロジェクトのタスク一覧を見るためには*`gradle <project-path>:tasks`*を実行します。この例では*`gradle :app:tasks`*と試してください。*
appプロジェクトはJava applicationプラグインを適用してmainクラスを構成されたJavaアプリケーションだとしましょう。

```gradle:app/build.gradle
plugins {
    id 'application'
}

application {
    mainClass = 'com.example.Hello'
}
```
```java:app/src/main/java/com/example/Hello.java
package com.example;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
```
applicationプラグインからのrunタスクでアプリケーションを起動することができます。

```shell-session
> gradle -q run
Hello, world!
```

基本的なマルチプロジェクトビルドの作成はとてもシンプルです。

###[Adding subprojects](https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:adding_subprojects)
先ほど作ったプロジェクトにlibと呼ばれる他のサブプロジェクトを追加したいとしましょう。別の`include`文をルートの設定ファイルに追加する必要があります。

```gradle:settings.gradle
rootProject.name = 'basic-multiproject'
include 'app'
include 'lib'
```

Gradleがlib/サブディレクトリにある新しいサブプロジェクトのビルドファイルを見に行くようになります。

```:プロジェクト構造
.
├── app
│   ...
│   └── build.gradle
├── lib
│   ...
│   └── build.gradle
└── settings.gradle
```

次に、どのように[ビルドロジックをサブプロジェクト間で共有する](https://docs.gradle.org/current/userguide/sharing_build_logic_between_subprojects.html#sharing_build_logic_between_subprojects)のか、どのようにあるプロジェクトが[別プロジェクトに依存させる](https://docs.gradle.org/current/userguide/declaring_dependencies_between_subprojects.html#declaring_dependencies_between_subprojects)のかの見ていきましょう。

###[Naming recommendations](https://docs.gradle.org/current/userguide/multi_project_builds.html#naming_recommendations)
プロジェクトが成長していくにつれて、命名とその一貫性が重要になってきます。保守性を維持するため、下記のように推奨します。

1. サブプロジェクトのデフォルト名を維持する：設定ファイルでプロジェクトのカスタム名を構成することができます。しかし、開発者がどのプロジェクトがどのフォルダーに属しているかを追跡するのは不必要な追加の労力です。
1. すべてのプロジェクト名にはケバブケース形式を使用する：ケバブケース形式はすべての文字は小文字で記述し、単語の区切りは`-`を使用する形式です。これは多くの大型プロジェクトで事実上の標準となっており、Gradleは[ケバブケースの名前の省略](https://docs.gradle.org/current/userguide/command_line_interface.html#sec:name_abbreviation)をサポートしています。
1. 設定ファイル内でルートプロジェクト名を定義します：`rootProject.name`はビルド全体に効果的に名前を割り当て、それはビルドスキャンのようなレポートで使用されます。ルートプロジェクト名が設定されていない場合、名前は格納されているフォルダ名となり不定となります。言い換えると、設定ファイルで指定されていれば、プロジェクトを任意のディレクトリにチェックアウトできます。