この記事は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」と表示できた
- 実装中のコードは以下のリポジトリにまとめてある