更改文件后自动重启 Snap 服务器

Automatically restart Snap server after changing a file

我已经开始学习一些关于 snap 框架的知识,我找到了一些关于 blaze snap 的教程并且想构建一个小的网络应用程序。

在 html 部分更改代码时的乏味之处在于我必须 Ctrl+C 现有的 Snap 服务器,然后 cabal run 重新启动它是否有更简单的方法。

我发现了以下实用程序 watchr,它允许 运行 在某个文件被更改后执行命令 - 这绝对有用,但我不太清楚如何应用它这种情况。

获取一个最小的工作示例 - 使用 snap init barebone 命令并将 src/Main.hs 替换为

{-# LANGUAGE OverloadedStrings #-}
module Main where

import           Control.Monad (forM_)
import           Control.Applicative ((<|>))
import           Snap.Core
import           Snap.Util.FileServe
import           Snap.Http.Server
import           Snap.Blaze (blaze)
import qualified Data.Text as T
import qualified Text.Blaze.Html5 as H

main :: IO ()
main = quickHttpServe site

site :: Snap ()
site =
    ifTop testHandler <|>
    dir "static" (serveDirectory ".")

testHandler :: Snap ()
testHandler = blaze $ H.docTypeHtml $
    do H.head $ H.title "SnaptestBlaze"
       H.body $ do H.p "Blaze makes Html"
                   H.ul $ forM_ [1..10::Int] (H.li . H.toHtml)

并确保在相应的 *.cabal 文件中包含 snap-blazeblaze-html

我还看到有一个包 snap-loader-dynamic 听起来很有希望,但我无法为所需的依赖项构建应用程序,并且 cabal 沙箱中的依赖项具有不同的哈希值。

我看到有 stack 最终取代了长 运行 中的 cabal,但我没有足够的时间检查 stack 是否可以自动执行重建并重新启动。

如果我开发的环境相关:Linux (Mint) + cabal-sandbox.

Snap 本身内置了此功能。假设您使用 snap init 初始化您的项目,只需通过

构建您的项目
cabal install -fdevelopment

它会根据需要动态重新加载。

丹尼尔的回答绝对正确。但是,如果您想要不涉及代码更改的重新加载,那也是可能的。有关示例,请参阅 this blog post