Kotlin MPPのクソダサいディレクトリ配置をどうにかする
前置き
みなさん、Kotlin MPPは使ってますか? Kotlin 1.4でIntelliJのプロジェクト生成時のダイアログも進化したり、色々あって着実に改善が行われてますね。では、Kotlin MPPを使う上での一番の問題は何だと思いますか?
タイトルにもありますが、私はデフォルトのディレクトリ構成が死ぬほどダサいと思っています。Kotlin公式ドキュメントから借用するとこんな感じ
└── src
├── commonMain
│ └── kotlin
├── commonTest
│ └── kotlin
├── jsMain
│ └── kotlin
├── jsTest
│ └── kotlin
├── jvmMain
│ └── kotlin
├── jvmTest
│ └── kotlin
├── macosMain
│ └── kotlin
└── macosTest
└── kotlin
Gradleの標準構成はこう
└── src
├── main
│ └── kotlin
└── test
└── kotlin
いやまぁ、どうしてそうなったか分かるのは分かるんですが、src配下にtargetの数だけmainとtestのディレクトリがずらずらと並んでるのは分かりにくいですよね・・・
個人的な理想構成はコレです
└── src
├── main
│ ├── common
│ │ └── kotlin
│ ├── js
│ │ └── kotlin
│ ├── jvm
│ │ └── kotlin
│ └── macos
│ └── kotlin
└── test
├── common
│ └── kotlin
├── js
│ └── kotlin
├── jvm
│ └── kotlin
└── macos
└── kotlin
まぁこの辺は好みです。
それはさておき、以下の本題ではKotlin MPPにおいて、任意のフォルダをソースルートとして設定する方法を書きます。
環境
- Kotlin 1.4.10
- IntelliJ IDEA U 2020.2.3
- Gradle 6.3
- IntelliJ Kotlin Plugin 1.4.10-release-IJ2020.2-1
本題: 略解
kotlin {
sourceSets {
val commonMain by getting {
// コレ
this.kotlin.srcDir("src/main/common/kotlin")
}
}
}
sourceSets
内で、各sourceSetに対して kotlin.srcSir("対象のディレクトリのパス")
と記述する事で任意のディレクトリをソースルートとして指定する事が可能です。
本題: 解説
Kotlinのmultiplatform pluginは、指定されたtargetに応じたSourceSetを自動生成します。それがcommonMainやsommonTest等ですね。これらのSourceSetの名前は変更する事ができず、デフォルトでsrc/${sourceSet.name}
がソースルートとして指定されています。
kotlin.sourceSets.getting
の引数はKotlinSourceSet
をレシーバーとする関数です。KotlinSourceSet
に関する説明は省略します。KotlinSourceSet.srcDir
がKotlin/JVMで言うところのsrc/main/kotlin
フォルダやsrc/test/kotlin
フォルダを指す集合です。
このKotlinSourceSet.srcDir
というのはGradleのSourceDirectorySet
という型で、できる操作は中身の取得と対象ディレクトリの追加です(他にもいくつかありますが今回は関係ないです)。仕様として、存在しないフォルダは無視されるため、SourceDirectorySet
に独自のディレクトリを追加し、標準のディレクトリをディスクから削除してしまえば実質的にソースルートを変更する事ができます。
最後に
本題が前置きより短いの草
要望、指摘等あれば気軽にどうぞ
Discussion