Gradleで解決された依存関係の情報を見てみる

Gradleにdependeciesで利用するライブラリを指定すると、メタファイルを解析して依存関係を解決し、そのライブラリが依存しているファイルを自動的に取り込んでくれます。
･･････ってことは、その解決した情報はどこかにあるんだろうから、それ見てみたいなーと思って調べて見ました。

Androidのプロジェクトテンプレートから作られた、以下の依存関係が書かれたプロジェクトで調べて見ます。

```kotlin
dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    implementation(libs.androidx.activity)
    implementation(libs.androidx.constraintlayout)
}
```

ひとまず、`tasks.register`でgradle taskを追加して、その中で実行します。
`configurations`の中からリリースビルド時に使われる`releaseRuntimeClasspath`の構成を取得して、
`resolvedConfiguration.lenientConfiguration`から、firstLevelModuleDependenciesを参照すると、このプロジェクトが直接依存しているライブラリの情報を取得することができます。

```kotlin
tasks.register("appDependency") {
    val configuration = configurations["releaseRuntimeClasspath"] ?: return@register
    configuration.resolvedConfiguration
        .lenientConfiguration
        .firstLevelModuleDependencies
        .map { "${it.moduleGroup}:${it.moduleName}:${it.moduleVersion}" }
        .sorted()
        .forEach {
            println(it)
        }
}
```

これを実行すると以下のように出力されます

```
androidx.activity:activity:1.10.1
androidx.appcompat:appcompat:1.7.0
androidx.constraintlayout:constraintlayout:2.2.1
androidx.core:core-ktx:1.16.0
com.google.android.material:material:1.12.0
org.jetbrains.kotlin:kotlin-stdlib:2.0.21
```

そして、`allModuleDependencies`を参照すると、依存ライブラリが依存しているライブラリも含めたプロジェクトが依存しているすべての依存関係を取得することができます。

```kotlin
tasks.register("appDependency") {
    val configuration = configurations["releaseRuntimeClasspath"] ?: return@register
    configuration.resolvedConfiguration
        .lenientConfiguration
        .allModuleDependencies
        .map { "${it.moduleGroup}:${it.moduleName}:${it.moduleVersion}" }
        .sorted()
        .forEach {
            println(it)
        }
}
```

これを実行すると以下のように表示されます。

```
androidx.activity:activity:1.10.1
androidx.annotation:annotation-experimental:1.4.1
androidx.annotation:annotation-jvm:1.8.1
androidx.annotation:annotation:1.8.1
androidx.appcompat:appcompat-resources:1.7.0
androidx.appcompat:appcompat:1.7.0
androidx.arch.core:core-common:2.2.0
androidx.arch.core:core-runtime:2.2.0
androidx.cardview:cardview:1.0.0
androidx.collection:collection-jvm:1.4.2
androidx.collection:collection:1.4.2
androidx.concurrent:concurrent-futures:1.1.0
androidx.constraintlayout:constraintlayout-core:1.1.1
androidx.constraintlayout:constraintlayout:2.2.1
androidx.coordinatorlayout:coordinatorlayout:1.1.0
androidx.core:core-ktx:1.16.0
androidx.core:core-viewtree:1.0.0
androidx.core:core:1.16.0
androidx.cursoradapter:cursoradapter:1.0.0
androidx.customview:customview:1.1.0
androidx.documentfile:documentfile:1.0.0
androidx.drawerlayout:drawerlayout:1.1.1
androidx.dynamicanimation:dynamicanimation:1.0.0
androidx.emoji2:emoji2-views-helper:1.3.0
androidx.emoji2:emoji2:1.3.0
androidx.fragment:fragment:1.5.4
androidx.interpolator:interpolator:1.0.0
androidx.legacy:legacy-support-core-utils:1.0.0
androidx.lifecycle:lifecycle-common:2.6.2
androidx.lifecycle:lifecycle-livedata-core:2.6.2
androidx.lifecycle:lifecycle-livedata:2.6.2
androidx.lifecycle:lifecycle-process:2.6.2
androidx.lifecycle:lifecycle-runtime:2.6.2
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2
androidx.lifecycle:lifecycle-viewmodel:2.6.2
androidx.loader:loader:1.0.0
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
androidx.print:print:1.0.0
androidx.profileinstaller:profileinstaller:1.4.0
androidx.recyclerview:recyclerview:1.1.0
androidx.resourceinspection:resourceinspection-annotation:1.0.1
androidx.savedstate:savedstate:1.2.1
androidx.startup:startup-runtime:1.1.1
androidx.tracing:tracing:1.2.0
androidx.transition:transition:1.5.0
androidx.vectordrawable:vectordrawable-animated:1.1.0
androidx.vectordrawable:vectordrawable:1.1.0
androidx.versionedparcelable:versionedparcelable:1.1.1
androidx.viewpager2:viewpager2:1.0.0
androidx.viewpager:viewpager:1.0.0
com.google.android.material:material:1.12.0
com.google.errorprone:error_prone_annotations:2.15.0
com.google.guava:listenablefuture:1.0
org.jetbrains.kotlin:kotlin-bom:1.8.22
org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22
org.jetbrains.kotlin:kotlin-stdlib:2.0.21
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3
org.jetbrains:annotations:23.0.0
org.jspecify:jspecify:1.0.0
```

依存関係をチェックするタスクを作るとかに使えそうですね。