JacocoMerge が Deprecated になったので、JacocoReport でレポートをマージする

# 概要
カバレッジ計測ツール JaCoCo の Gradle プラグインで、[JacocoMerge](https://docs.gradle.org/current/javadoc/org/gradle/testing/jacoco/tasks/JacocoMerge.html) が Deprecated になりましたので、
これを使わない方法でマルチモジュールの JaCoCo レポートをマージするように変更しました。

## 背景
[Gradle6系 + Jacoco + マルチモジュール + フルKotlin + Android + Robolectric環境でユニットテストのカバレッジを出す](https://qiita.com/ryo_mm2d/items/e431326f701e74ec49fa)
の記事を参考にして、マルチモジュールの Android アプリプロジェクトで JaCoCo のレポートをマージしていました。

### Deprecated.
[JacocoMerge](https://docs.gradle.org/current/javadoc/org/gradle/testing/jacoco/tasks/JacocoMerge.html) より

> The JacocoReport task accepts multiple execution files as an input.
> This task type provides duplicated functionality and will be removed in Gradle 8.0.

JaCoCo Gradle プラグインの JacocoMerge は残念ながら Deprecated となってしまいました。
Gradle 8.0 で削除予定ということで、いつまでも使い続けるわけにはいきません。

# 修正
先ほどの引用の通り、 `JacocoReport` が複数の実行ファイルを扱えるようになったので、それを利用します。

## 変更前
私のプロジェクトの場合は、ルートの build.gradle に以下の記述をして、
`$ gradlew jacocoTestReport` で各モジュールのカバレッジレポートを作成してから、
`$ gradlew jacocoMergedTestReport` を実行することで、マージされたレポートを作成していました。

```groovy:build.gradle
task mergeJacocoFiles(
    type: JacocoMerge,
    group: "verification"
) {
    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            executionData "${project.buildDir}/jacoco/testDebugUnitTest.exec"
        }
    }
}

task jacocoMergedTestReport(
    type: JacocoReport,
    dependsOn: [tasks.mergeJacocoFiles],
    group: "verification"
) {
    getExecutionData().from = mergeJacocoFiles.destinationFile

    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            getSourceDirectories().from += "${project.projectDir}/src/main/java"
            getClassDirectories().from += project.fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/debug")
        }
    }
    reports {
        xml.enabled = true
        html.enabled = true
    }
}
```

## 変更全体

```kotlin
tasks.register("jacocoMergedTestReport", JacocoReport::class.java) {
    group = "verification"
    subprojects {
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            executionData.from += "${project.layout.buildDirectory.get()}/jacoco/testDebugUnitTest.exec"
            sourceDirectories.from += "${project.projectDir}/src/main/java"
            classDirectories.from.addAll(
                project.fileTree("${project.layout.buildDirectory.get()}/tmp/kotlin-classes/debug") {
                    // exclude("**/view/**", "**/ui/**")
                }
            )
        }
    }
    reports {
        xml.required.set(false)
        html.required.set(true)
    }
}
```

具体的には以下の変更をしました。

1. 出力先を変更していた mergeJacocoFiles タスクを削除
2. jacocoMergedTestReport からその依存(dependsOn の行)を削除
3. jacocoMergedTestReport の1行目に書いていた getExecutionData().from = mergeJacocoFiles.destinationFile を削除
4. ループの中に executionData を移動させるコードを追加

testDebugUnitTest などパスの細部はプロジェクト構成によって変わりますので、適宜変更してください。

## 実行
修正前と同様に、 `$ gradlew jacocoTestReport` で各モジュールのカバレッジレポートを作成してから、
`$ gradlew jacocoMergedTestReport` を実行することで、マージされたレポートが作成されました。

# おわりに
JaCoCo Gradle プラグインの [JacocoMerge](https://docs.gradle.org/current/javadoc/org/gradle/testing/jacoco/tasks/JacocoMerge.html) が Deprecated になりました。
jacocoReport を使ってマージするようにタスクを書き換え、複数モジュールの JaCoCo レポートをマージするように変更しました。

# 修正
tasks.create が Deprecated になったりして動かなくなっていたコードを Gradle KTS で書き直しました。tasks.register と subprojects を使うのがポイントです。