Home About
Kotlin , Gradle

Kotlin Native で テキストファイルを読み込む Hello, World!

しばらく諸事情により遠ざかっていた Android アプリ開発を再開しようと思っている。 そのウォーミングアップとして Kotlin でスクリプトを書いたりしているのだが、 結構いい感じ。 もちろん普通に JavaVM 上で動く Kotlin で開発しているのだが、 それとは別に Kotlin Native というものがあり たとえば Linux X64 ネイティブ実行できる実行ファイルを生成できるらしい。 かっこいい!と思って調べはじめたのだが、思いのほか難しかった。 とりあえず、テキストファイルを読みとって標準出力するところまでたどり着いたので、 その記録を残す。

Gradle を使おう

そもそもの話、Kotlin Native するには、いくつかの方法がある。 今わかっている範囲では、 外部ライブラリを使わないのであれば、 Github の Kotlin リリースページ https://github.com/JetBrains/kotlin/releases/tag/v1.7.0 から、 kotlin-native-linux-x86_64-1.7.0.tar.gz をダウンロードしてきて展開してパスを通せばよい。 (もちろん、Linux x64 を使用している場合)

外部のライブラリを maven を経由して利用したければ、Gradle を使う必要がある。 この方法の場合、 (当然 Gradle をインストールする必要があるが) kotlin-native-linux-x86_64-1.7.0.tar.gz を入れる必要はないようだ。

今回はテキストファイルを読むのに mavenCentral にある native-file-io というライブラリを使うので、 Gradle 方式でいく。 使用した Gradle のバージョンは 6.7.1。

native-file-io

Linux X64 の対応がある native-file-ioを使ってみる。

myhello というプロジェクトを作成して、必要なファイルやディレクトリを準備する。

$ mkdir myhello
$ cd myhello
$ touch settings.gradle
$ touch build.gradle
$ touch hello.txt
$ mkdir -p src/nativeMain/kotlin
$ touch src/nativeMain/kotlin/main.kt 

settings.gradle は空のファイルのままでよい。

build.gradle は次のように記述する。

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.7.0'
}

repositories {
    mavenCentral()
}

kotlin {
    linuxX64('native'){
        binaries {
            executable()
        }
    }
    sourceSets {
        commonMain {
            dependencies {
                implementation "me.archinamon:file-io:1.3.4"
                implementation "me.archinamon:file-io-linuxx64:1.3.4"
            }
        }
    }
}

wrapper {
    gradleVersion = '6.7.1'
    distributionType = 'BIN'
}

hello.txt を次のように記述する。

Hello, World!

src/nativeMain/kotlin/main.kt を次のように記述する。

import me.archinamon.fileio.*

fun main() {
    val helloFile = File("hello.txt")
    if( helloFile.exists() ){
        val text = helloFile.readText()
        print("${text}")
    }
}

これで全ての準備ができたのでビルドして実行。

$ gradle nativeBinaries
$ build/bin/native/releaseExecutable/myhello.kexe 
Hello, World!

ユーザが Linux X64 であれば、 myhello.kexe だけを渡せば実行できるのは確かに素敵です。

以上です。

追伸

Gradle のバージョン等:

$ gradle -version

------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------

Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          11.0.15 (Private Build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OS:           Linux 5.4.0-121-generic amd64