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 を変更したら それを検知して上の処理がもう一度走る。