💤

Kotlin MPPのクソダサいディレクトリ配置をどうにかする

2020/10/13に公開

前置き

みなさん、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