Uzzu::Blog

Software Design, and my life.

Gradle Module Metadata便利

Gradle Module Metadataの仕組みに乗っかるとdependenciesの記述作業が減って便利。

JUnit5.6もサポートしましたね。

Kotlin MPPで複数のNativeTarget(iosX64, linux64, etc…)を対象としたライブラリなりアプリケーションを作成する中で kotlinx-coroutines-corekotlinx-serialization-runtime の依存関係を記述していく際、複数のNativeTargetが存在するにも関わらず

kotlin {
    //
    // 略
    //
    sourceSets {
        //
        // 略
        //
        nativeMain {
            dependsOn commonMain
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.3-native-mt'
            }
        }
        iosX64Main.dependsOn nativeMain
        linux64Main.dependsOn nativeMain
        //
        // 略
        //
    }
}

というように手前で作成したSourseSetに対して依存を記述して、あとはSouceSet同士の依存を解決するだけで、iOSX64やlinux64向けの kotlinx-coroutines-core の依存関係を解決してくれます。

これには4.10あたりからfeature previewが始まり6.0でデフォルト有効になったGradle Module Metadataの仕組みが利用されています。

https://blog.gradle.org/gradle-metadata-1.0

↑を読めば答えが全て載ってますが、ざっと3行でまとめると

  • ライブラリ開発者側でmodule metadataを含むartifactをpublishする
  • ライブラリ利用者は対象のGradle versionを利用して(6.0未満ではsettings.gradleにて enableFeaturePreview("GRADLE_METADATA") する)、dependencies(DependencyHandlerScope)内で build targetのartifact idを直接指定するのではなく、module metadataを含むartifactのidを代わりに指定する
  • Gradleが現在のbuild targetに合わせてよしなに依存関係をしてくれる

というわけです。

module metadataの中身がどうなっているかは ~/.gradle/caches/modules-2/files-2.1/ に生のartifact群があるので、対象artifactの.module な拡張子のJSONファイルを確認しましょう。module metadataによる依存解決機能を利用する際も、commonMainだけに依存を書いて特定のbuild targetの依存ライブラリが解決できない場合、同ディレクトリ中の対象artifactを確認すると、Gradle Module Metadataに対応しているか、あるいは利用しようとしているbuild targetに対応しているが確認できます。

Kotlin Multiplatform Libraryにおいてはplugin側が既に対応しているので、後はGradleのバージョンを上げるかfeature previewを有効にすると出力してくれます。module metadataを含むmaven publication nameは kotlinMultiplatform なので、これをハンドルしてartifact idを変更する事もできます。kotlinx-coroutines-core-nativeもgradle metadata artifactのidをリネームしてたんですね

もちろん全部が全部乗っかれるわけではない(AndroidだけどJUnit5したい等)のでその辺は適宜いい感じにやりましょう。 MPPライブラリ開発者の方はignoreせずmodule metadata artifactもpublishしましょう。

とにかく、Gradle scriptから冗長な依存関係の記述が消えて気持ちよくなった。これは良いものですね。

comments powered by Disqus