Kotlin Multiplatform(KMP)プロジェクトにおいて、Gradleのdependencies
定義に混乱したことはありませんか?
特に、「トップレベルのdependencies
とsourceSets
内のdependencies
って何が違うの?」「依存関係どっちのdependencies
に追加したらいいの?」と感じた方も多いはずです。
本記事では、Android Gradle Plugin(AGP)とKMPプラグインがそれぞれ管理するdependencies
の違いをわかりやすく整理します。
Gradleプラグインの役割整理
🔧 Android Gradle Plugin(AGP)
公式ドキュメント によれば、AGPは Android特有のビルド処理 を行うGradle拡張プラグインです。
plugins {
alias(libs.plugins.androidApplication)
// → "com.android.application"
}
これにより、Androidアプリ向けのビルド設定が自動化されます。
🌐 Kotlin Multiplatform Plugin(KMP)
KMP公式ガイド によれば、KMPプラグインは 共通のKotlinコードを複数プラットフォームにコンパイル する仕組みを提供します。
plugins {
alias(libs.plugins.kotlinMultiplatform)
// → "org.jetbrains.kotlin.multiplatform"
}
Q. AGPとKMP、どちらかだけでOK?
A. NO!
KMPプロジェクトにおいても、AndroidビルドにはAGPが必須です。
AGPとKMPは以下のような住み分けで動作します:
プラグイン | 主な責任 |
---|---|
AGP | Android向けビルドタスクの処理 |
KMP | 共通コード・マルチプラットフォーム出力の管理 |
dependencies
の違い:定義場所で作用範囲が異なる!
1. トップレベルの dependencies
dependencies {
implementation("androidx.core:core-ktx:1.10.1")
}
- 管理者:AGP
- 対象範囲:Androidモジュール全体
- Androidアプリ単体でビルドしているときと同様の扱い
2. sourceSets
内の dependencies
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
}
}
}
Q. なぜ commonMain
の依存関係が androidMain
や iosMain
からも参照できるの?
A. commonMain
は各プラットフォームのベースになるからです。
KMPでは、commonMain
が基底ソースセットとして機能し、各プラットフォームのソースセット(androidMain
、iosMain
など)がこれを「継承」する構造になっています。
これはGradleのマルチプラットフォームプラグインが持つ 暗黙的な継承機構 に基づいています。
参考:The basics of Kotlin Multiplatform project structure – SourceSets
まとめ
- AGPとKMPは別々の目的で動作している
-
dependencies
の定義場所で作用範囲が変わる -
commonMain
の依存関係は、プラットフォーム側でも使えるように設計されている
おわりに
KMP導入初期にぶつかりがちなこの依存関係の違い、理解が進めば柔軟なアーキテクチャ設計が可能になります。
似たような悩みを持っている方は多いと思うので、本記事がその一助となれば幸いです 🙌
Views: 0