🗂

[Ktor]やっとAuto-reloadできた

2022/10/19に公開

公式にはすごい簡単に書いてあったのに変に苦労したので、備忘録として残しておくか~と思って。

手順

  1. development modeを有効にする
  2. watch pathsを設定する
  3. Rebuildする
  4. アプリケーションの実行

development modeを有効にする

embeddedServerを使っていたので、build.gradle.kts内で設定した。

build.gradle.kts
application {
    applicationDefaultJvmArgs = listOf("-Dio.ktor.development=true")
}

watch pathsを設定する

これはembeddedServer関数に渡す。ファイルの内容が変更されたかどうかを監視するためっぽい。(公式はoptionalって言ってるから無くてもいいのかもしれないよくわからんのでちゃんと確認しよ)

Application.kt
fun main() {
    embeddedServer(
        Netty,
	port = 8080,
	host = "0.0.0.0",
	watchPaths = listOf("classes")
    ) {
    // 上の関数の第四引数の通りに渡す
        get() {
	    //Do something
	}
    }.start(wait = true)
}

Rebuildする

ここからが躓いたポイント。まずTerminalで./gradlew -t build -x test -iを実行する(testも含めてRebuildしたい場合はbuildまででOK)。最後にこんな感じの結果が返ってくれば成功。

BUILD SUCCESSFUL in 4s
11 actionable tasks: 11 up-to-date
Watched directory hierarchies: [C:\Users\hoge\IdeaProjects\ktor-sample]

Waiting for changes to input files... (ctrl-d then enter to exit)
<-------------> 0% WAITING

ただし、この状態だとプロセスは終了しておらず、ファイルが変更されるのを待ち続けている。変更されるともう一度Rebuildされ、正常に完了すると上の状態に戻る。これを終わらせるにはCtri-DとEnterを押す。

アプリケーションの実行

ここでTerminalから実行するのだが、上のプロセスを終わらせてはいけない。新しいセッションを立ち上げて、そっちで実行する(自分はずっとここで引っかかってできなかった)。
新規セッションで./gradlew runを実行し、こんな感じで止まればOK。

2022-10-19 20:04:17.931 [main] INFO  ktor.application - Application started in 0.145 seconds.
2022-10-19 20:04:18.340 [main] INFO  ktor.application - Responding at http://127.0.0.1:8080
<===========--> 85% EXECUTING [20s]
> :run

ここで http://127.0.0.1:8080 に飛べば、あなたの作ったページが表示される。


Auto-reloadの動作確認

ファイルの中身を書き換える(サンプルコードのテキストを変更するとか)と自動でプロジェクトがRebuildされるので、それが完了したら開いているページを更新する。変更が反映されていれば無事Auto-reloadが機能していることになる。おめでとう!!

参考

Discussion