自作したライブラリがJVM用のビルドしかできなかったのと、昨今のKMP化していきましょうの流れを汲み取ってやってみたので、わすれないためにその記録をメモっておく。
コミットは↓の通り。
少し余計なものが入ってるけど settings.gradle.kts
と build.gradle.kts
の内容が主な変更点。
少しずつおさらいしていく。
まずは settings.gradle.kts
から。
Android Gradle pluginがgoogleリポジトリにて配布されているので追加する必要がある。
+pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0" }
つづいて build.gradle.kts
まずはプラグインの追加&削除。
Kotlin/JVM用のプラグインを外してKMP用のプラグインを追加する。
また、Android用のビルドのためにAndroid Gralde Pluginを追加する。
- id("org.jetbrains.kotlin.jvm") version "1.9.20" + val kotlinVersion = "1.9.20" + kotlin("multiplatform") version kotlinVersion + id("com.android.library") version "8.2.0"
repositories {
mavenCentral()
+ google()
}
本丸のkotlin用設定。丸ごと載せておく。
最小構成に近いものだとこんな感じと思われる。
ソースの置き場とビルド対象のプラットフォームごとの設定を追記していく。
kotlin { applyDefaultHierarchyTemplate() sourceSets { val commonMain by getting { dependencies { // common dependencies } } val commonTest by getting { dependencies { implementation(kotlin("test")) } } } jvm { withSourcesJar(true) } androidTarget { publishLibraryVariants("release", "debug") compilations.all { kotlinOptions { jvmTarget = "1.8" } } } iosArm64() iosSimulatorArm64() linuxX64() macosArm64() }
AndroidとiOSが厄介で、前者はAndroid SDK, 後者はXCodeが必要となる。
Android SDKはAndroid Studioをインストールすることで併せてインストールするというという手もあるが、IntelliJを利用しているものとしては2つの類似アプリケーションを入れるのはディスクももったいないので避けたい。そこで、IntelliJにAndroidプラグインを追加し、設定から Languages & Frameworks -> Android SDK
のところで任意のSDKをインストールしておくのが良い。あとは $HOME/Library/Android/sdk
をPATHに通してあげればビルドにコケることは無いはず。
iOSはXCodeをApp Storeからインストールすればよいだけのはず。
もしかしたらiOS用のSDKの追加とかも必要 だったかも。 なので以下コマンドを実行してダウンロードしておく。
xcodebuild -downloadPlatform iOS
Android設定。
正直あまり詳しくないが、 namespace
と compileSdk
だけは書いとかないとだめだったはず。あとはバージョン系の互換性のための記述をいくつか書いておくと良いかもということでこのようにした。
android { namespace = "com.jsoizo.paritialfunction" compileSdk = 34 defaultConfig { minSdk = 28 } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }
最後に、ソースコードを移動させる。
JVM用だけだったときは src/main/kotlin
にコードを配置していたが、
- プラットフォーム共通コード:
src/commonMain/kotlin
配下 - プラットフォーム別コード:
src/プラットフォーム名/kotlin
配下
に置かなければならない。テストも同じルールで移動が必要。
僕のコードは全部Pure Kotlinで実装されておりJavaへの依存などもなかったのですべて commonMain
以下に移動させた。
これでおおよそKMP用にビルドができるはずである。
テストの実行などはプラットフォーム毎のテスト呼び出しタスクがある。
例えばAndroidの場合だとこんな感じになる。
:cleanTestDebugUnitTest :testDebugUnitTest --tests "com.jsoizo.paritialfunction.*"
テスト用のタスクがわからないとき、IntelliJ上でテストクラスを指定して実行しようとするとプラットフォーム選択の画面が表示されるのでそれに従って実行し、 Run/Debug configuration
の画面からタスクを確認するとよい。
だいたいこんな感じ!!!
ちなみに、Maven Centralで配布することにしたので、この記事を参考にやった。
ほぼこれをトレースすればうまくいくはずである。
おわりっ!!!!