1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kotlin Multiplatform Sample

Last updated at Posted at 2025-01-13

概要

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

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

試した機能

環境

  • 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による非同期処理
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ターゲット

src/jvmMain/kotlin/Main.kt
fun main() = runBlocking {
    appMain()
}

actual val fileSystem = FileSystem.SYSTEM

jvm以外のターゲット➔GitHub参照。

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 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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?