- Notifications
You must be signed in to change notification settings - Fork1
Kotlin Native library for run child process or external command.
License
kgit2/kommand
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Kotlin Native library for create sub-process and redirect their I/O.
Rust is an excellent language that takes into account both performance and engineering.
In version 1.x, we use the following API to provide the function of creating child processes
fork
of [POSIX api]CreateChildProcess
of [win32 api]java.lang.ProcessBuilder
of JVM
In version 2.x, we use the Rust standard library to provide the function of creating child processes.
std::process::Command
of Rustjava.lang.ProcessBuilder
of JVM
It will bring
- More unified API
- Easier to use API
- Performance is still excellent
- Easier to maintain
- Code structure is clearer
- x86_64-apple-darwin
- aarch64-apple-darwin
- x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- x86_64-pc-windows-gnu (mingw-w64)
- jvm
- Rust Standard Library 1.83.0
- Kotlin Multiplatform 2.1.0
build.gradle.kts
:
// ……repositories { mavenCentral()}// ……dependencies {// should replace with the latest version implementation("com.kgit2:kommand:2.x")}
kommand/kommand-examples/example1/src/commonMain/kotlin/com/kgit2/kommand/Main.kt
Lines 1 to 12 inaf7c721
packagecom.kgit2.kommand | |
importcom.kgit2.kommand.process.Command | |
importcom.kgit2.kommand.process.Stdio | |
funmain() { | |
Command("ping") | |
.args(listOf("-c","5","localhost")) | |
.stdout(Stdio.Inherit) | |
.spawn() | |
.wait() | |
} |
kommand/kommand-examples/example2/src/commonMain/kotlin/com/kgit2/kommand/Main.kt
Lines 1 to 15 inaf7c721
packagecom.kgit2.kommand | |
importcom.kgit2.kommand.process.Command | |
importcom.kgit2.kommand.process.Stdio | |
funmain() { | |
val child=Command("ping") | |
.args(listOf("-c","5","localhost")) | |
.stdout(Stdio.Pipe) | |
.spawn() | |
child.bufferedStdout()?.lines()?.forEach { line-> | |
println(line) | |
} | |
child.wait() | |
} |
kommand/kommand-examples/example3/src/commonMain/kotlin/com/kgit2/kommand/Main.kt
Lines 1 to 12 inaf7c721
packagecom.kgit2.kommand | |
importcom.kgit2.kommand.process.Command | |
importcom.kgit2.kommand.process.Stdio | |
funmain() { | |
Command("echo") | |
.arg("nothing") | |
.stdout(Stdio.Null) | |
.spawn() | |
.wait() | |
} |
kommand/kommand-examples/timeout/src/appleMain/kotlin/com/kgit2/kommand/Main.kt
Lines 1 to 60 in7367c60
packagecom.kgit2.kommand | |
importcom.kgit2.kommand.process.Command | |
importkotlinx.coroutines.Dispatchers | |
importkotlinx.coroutines.IO | |
importkotlinx.coroutines.async | |
importkotlinx.coroutines.runBlocking | |
importkotlinx.coroutines.withTimeout | |
importkotlinx.datetime.Clock | |
funmain()= runBlocking(Dispatchers.Default) { | |
// Sleep with regular | |
val start=Clock.System.now() | |
val status=Command("sleep").arg("5").status() | |
println("status:$status elapsed:${Clock.System.now()- start}") | |
// Sleep with timeout detection and timeout determination | |
val start2=Clock.System.now() | |
val child=Command("sleep").arg("5").spawn() | |
val childJob= async(Dispatchers.IO) { | |
runCatching { | |
child.wait() | |
}.onFailure { | |
println("child result:$it") | |
}.getOrNull() | |
} | |
runCatching { | |
withTimeout(3000) { | |
childJob.await() | |
} | |
}.onSuccess { | |
println("status:$it elapsed:${Clock.System.now()- start2}") | |
}.onFailure { | |
child.kill() | |
println("status:$it elapsed:${Clock.System.now()- start2}") | |
} | |
// Sleep with timeout detection and determination that it will not timeout | |
val start3=Clock.System.now() | |
val child2=Command("sleep").arg("2").spawn() | |
val childJob2= async(Dispatchers.IO) { | |
runCatching { | |
child2.wait() | |
}.onFailure { | |
println("child result:$it") | |
}.getOrNull() | |
} | |
runCatching { | |
withTimeout(3000) { | |
childJob2.await() | |
} | |
}.onSuccess { | |
println("status:$it elapsed:${Clock.System.now()- start3}") | |
}.onFailure { | |
child2.kill() | |
println("status:$it elapsed:${Clock.System.now()- start3}") | |
} | |
Unit | |
} |
Full example checkkommand-examples/timeout.
Dependency:
required
kotlinx-coroutines
- rust toolchain - 1.83.0 (https://rustup.rs)
- just (install with
cargo install just
)
- just (install with
- cross-compile toolchain
- x86_64-apple-darwin
- aarch64-apple-darwin
- x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- x86_64-pc-windows-gnu (mingw-w64)
- docker (optional)
Recommend build all platforms in macOS.
Kotlin Multiplatform gets the most complete support on macOS.
If you are using macOS, you can install the cross-compile toolchain with
just prepareOtherwise, you need to install the cross-compile toolchain yourself.
git clone https://github.com/kgit2/kommand.git
cd kommand-corejust all
./gradlew build
Only linux support cross-platform test.
- install docker
- test it
# for x86_64just linuxX64Test# for aarch64just linuxArm64Test
@XJMiada.(Original Picture)
Apache2.0 © BppleMan
About
Kotlin Native library for run child process or external command.