kdnakt blog

hello there.

KotlinでHTTPサーバーを作るアドベントカレンダー(3日目:GradleでHello Kotlin/Native)

この記事はkdnaktの1人 Advent Calendar 2020の3日目の記事です。

 

2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、KotlinでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。

 

 

[Kotlin/Nativeプロジェクトを作成する]

▼なぜKotlin/Nativeか

KotlinはJVM上で動作するアプリケーションを作成するだけでなく、iOSAndroidWindowsMac上でネイティブアプリとして実行できるモジュールを作成できます。

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/debugExecutablebuild/native/bin/releaseExecutableの2つのディレクトリに、それぞれデバッグ用、リリース用のバイナリ(.kexeファイル)が作成されます。これを実行してみましょう。

$ ./build/bin/native/releaseExecutable/kttpd.kexe
Hello Kotlin/Native!

 

無事Hello worldが成功しました!🎉

 

[まとめ]

  • Kotlin scriptsの設定ファイルを元にKotlin/Nativeプロジェクトを作成した
  • ネイティブバイナリをビルドして「Hello Kotlin/Native」と表示できた
  • 実装中のコードは以下のリポジトリにまとめてある

github.com