ログ日記

作業ログと日記とメモ

yesod のリロード機能を再実装する

昨日 *1 はYesodからファイルを持ってきたが、ここでしていることは関連ファイルを監視して変更があればrunghcを実行するというもの。


何をやっているのかを理解するために、リロードする部分だけ抜き出して写経した。



yesod のコードから cabal を使わないようにして依存関係の処理を削っただけ。


動かすにはdevel.hsが必要。

module Main where

import Prelude
import Network.Wai (Application)
import Network.Wai.Handler.Warp
    (runSettings, defaultSettings, settingsPort)
import Control.Concurrent (forkIO)
import Network.Wai.Middleware.RequestLogger (logStdoutDev)
import Application
import Reload (develLoop)


main :: IO ()
main = do
  putStrLn "Starting devel application on localhost:3000"
  _ <- forkIO $ runSettings defaultSettings
    { settingsPort = 3000 } getApplicationDev
  develLoop

getApplicationDev :: Application
getApplicationDev = logStdoutDev getApplication

dist/devel-terminate のファイル名が気になったので、昨日のコードからloop関数を Reload.hs に移動した。
Application.hs は昨日のコードをそのまま利用。

runghc Reload

とすると、ghc devel.hs でコンパイル → runghc devel.hs が動き出す。

.hs を変更したら それを検知して上の処理がもう一度走る。