Kotlin Multiplatform Sample

# 概要
(日記)Kotlin Multiplatformでどのあたりまで共通で使えるものか試してみる。
ここでは下記プラットフォームで動作確認


- `jvm`  Java
- `js`  Javascript/Node.js 
- `mingwX64`   Windows 
- `linuxX64`  Linux  
- `wasmJs` WebAssembly/Node.js (じっけんて)

試した機能
- Coroutine 非同期処理
- Okio 3.10.2 : ファイル読み書き(*2)
- Ktor 3.1.0 : [ソースはこちら➔GitHub](https://github.com/kyoya-p/samples/tree/master/2025/multiplatform-ktor)
- kotest 5.9.1 : [ソースはこちら➔GitHub](https://github.com/kyoya-p/samples/tree/master/2025/multiplatform-ktor) // サポートプラットフォーム制限あり(*1)
- Compose でWebUI は[➔こちら] // TODO

# 環境
- Windwos 11 / Ubuntu 24.04(wsl)
- Kotlin 2.2.0-RC

# プロジェクト設定
```build.gradle.kts
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl

plugins {
    kotlin("multiplatform") version "2.1.0"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
    google()
}

kotlin {
    jvm()
    js { binaries.executable(); nodejs() }
    @OptIn(ExperimentalWasmDsl::class)
    wasmJs { binaries.executable(); nodejs() }
    mingwX64 { binaries.executable() }
    linuxX64 { binaries.executable() }

    sourceSets {
        val kotlin_coroutine = "1.10.1"  // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core
        val okio_version="3.10.2"         // https://mvnrepository.com/artifact/com.squareup.okio/okio
        val commonMain by getting
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutine")
            implementation("com.squareup.okio:okio:$okio_version")
        }
        val jsMain by getting
        jsMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$kotlin_coroutine")
            implementation("com.squareup.okio:okio-js:$okio_version")
            implementation("com.squareup.okio:okio-nodefilesystem:$okio_version")
        }
        val wasmJsMain by getting
        wasmJsMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-wasm-js:$kotlin_coroutine")
            implementation("com.squareup.okio:okio-wasm-js:$okio_version")
            implementation("com.squareup.okio:okio-fakefilesystem-wasm-js:$okio_version")
        }

        val mingwX64Main by getting
        mingwX64Main.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-mingwx64:$kotlin_coroutine")
            implementation("com.squareup.okio:okio-mingwx64:$okio_version")
        }
        val linuxX64Main by getting
        linuxX64Main.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-linuxx64:$kotlin_coroutine")
            implementation("com.squareup.okio:okio-linuxx64:$okio_version")
        }
    }
}
```

# 共通コード
- ファイルの読み書き
- coroutineによる非同期処理
```kotlin:src/commonMain/kotlin/AppMain.kt
expect val fileSystem: FileSystem

suspend fun appMain() {
    fileSystem.write("test.txt".toPath()) { writeUtf8("test") }
    val f = flow {
        (1..5).forEach {
            emit(it)
            delay(1000)
        }
    }
    GlobalScope.launch { f.collect { println(it) } }
    f.collect { println(it) }
    println(fileSystem.read("test.txt".toPath()) { readUtf8() })
}
```

# ターゲット別コード
jvmターゲット
```kotlin:src/jvmMain/kotlin/Main.kt
fun main() = runBlocking {
    appMain()
}

actual val fileSystem = FileSystem.SYSTEM
```
jvm以外のターゲット[➔GitHub](https://github.com/kyoya-p/samples/tree/master/2025/multiplatform)参照。

```sh:Gradleから実行 
sh gradlew jvmRun -DmainClass=MainKt    # jvm
sh gradlew jsNodeRun                    # js
sh gradlew runReleaseExecutableMingwX64 # mingwX64 (Windows上で実行) (*1)
sh gradlew runReleaseExecutableLinuxX64 # linuxX64 (*1)
sh gradlew wasmJsNodeRun                # wasmJs
```

# 実行ファイル生成・実行
```sh
sh gradlew build
node build/js/packages/multiplatform/kotlin/multiplatform.js # js
./build/bin/mingwX64/releaseExecutable/multiplatform.exe     # mingwX64 (Windows上で実行)
./build/bin/linuxX64/releaseExecutable/multiplatform.kexe    # linuxX64 (Ubuntu上で実行)
node build/js/packages/multiplatform-wasm-js/kotlin/multiplatform-wasm-js.mjs # wasmJs
```

# Note
*1: kotestは非対応なのかNativeでTest実行(`sh gradlew linuxX64Test`)時エラー
*2: wasmJsでは仮想的なファイルシステムへの操作となる

# Refer
- [Ktor Client](https://ktor.io/docs/client-supported-platforms.html)