Gradle Module Metadataの仕組みに乗っかるとdependenciesの記述作業が減って便利。
Why do libraries like Google Guava struggle with POM metadata and what does Gradle Module Metadata offer them?
— Gradle (@gradle) January 23, 2020
Find out in this new blog post about Gradle 6 dependency management: https://t.co/VLdUWK6wSE pic.twitter.com/nsTwLQCx8h
Kotlin MPPで複数のNativeTarget(iosX64, linux64, etc…)を対象としたライブラリなりアプリケーションを作成する中で kotlinx-coroutines-core
や
kotlinx-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から冗長な依存関係の記述が消えて気持ちよくなった。これは良いものですね。