この記事はkdnaktの1人 Advent Calendar 2020の3日目の記事です。
2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、KotlinでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。
[Kotlin/Nativeプロジェクトを作成する]
▼なぜKotlin/Nativeか
KotlinはJVM上で動作するアプリケーションを作成するだけでなく、iOSやAndroid、WindowsやMac上でネイティブアプリとして実行できるモジュールを作成できます。
HTTPサーバーといえばApache HTTP Serverでしょ!という偏見にもとづき今回のプロジェクトを進めているため、Apacheと同じネイティブバイナリを作成できるKotlin/Nativeを採用します。
Apacheのネイティブバイナリがhttpd
という名前で提供されているので、そのKotlinバージョンということでkttpd
というプロジェクト名にします。
▼設定ファイルを作成する
利用するOS、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: 15.0.1 (Oracle Corporation 15.0.1+9) OS: Mac OS X 10.15.7 x86_64
公式サイトのガイドにしたがって進めていきます。
Hello Kotlin/Native using Gradle - Kotlin Programming Language
まずは、プロジェクトのディレクトリを作成します。
作成したディレクトリに、ビルドスクリプトとしてbuild.gradle
またはbuild.gradle.kts
を作成します。Groovyにあまり馴染みがないので、build.gradle
ではなくbuild.gradle.kts
ファイルを作成していくことにします。ファイルの内容は以下のとおりです。
plugins { kotlin("multiplatform") version "1.4.20" } repositories { mavenCentral() } kotlin { macosX64("native") { binaries { executable() } } } tasks.withType{ gradleVersion = "6.7.1" distributionType = Wrapper.DistributionType.BIN }
次に、中身が空のsettings.gradle.kts
ファイルを作成します。
最後に、src/nativeMain/kotlin/hello.kt
ファイルを作成します。このファイルの中身は次のとおりです。
fun main() { println("Hello Kotlin/Native!") }
▼Hello Kotlin/Native!
実装ができたら、gradle nativeBinaries
コマンドを実行してネイティブバイナリをビルドしてみます。
$ gradle nativeBinaries > Configure project : Kotlin Multiplatform Projects are an Alpha feature. See: https://kotlinlang.org/docs/reference/evolution/components-stability.html. To hide this message, add 'kotlin.mpp.stability.nowarn=true' to the Gradle properties. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 20s 3 actionable tasks: 3 executed
初回なので20秒ほどビルドに時間がかかりました。Kotlin Multiplatformプラグインのアルファ版機能やGradleに関する警告がいくつか表示されますが、いったんここでは無視して進めます。
ビルドが成功すると、build/native/bin/debugExecutable
とbuild/native/bin/releaseExecutable
の2つのディレクトリに、それぞれデバッグ用、リリース用のバイナリ(.kexe
ファイル)が作成されます。これを実行してみましょう。
$ ./build/bin/native/releaseExecutable/kttpd.kexe Hello Kotlin/Native!
無事Hello worldが成功しました!🎉
[まとめ]
- Kotlin scriptsの設定ファイルを元にKotlin/Nativeプロジェクトを作成した
- ネイティブバイナリをビルドして「Hello Kotlin/Native」と表示できた
- 実装中のコードは以下のリポジトリにまとめてある