作为我的构建系统,我正在(或尝试)从出色的tup切换到haskell 摇动。
只有我不知道如何在更改时重建文件。
我当然可以使用 inotify 或像filewatcher甚至watchman这样的包装器。
由于我使用的是抖动,我想知道如何与共享 do 语法的twitch集成,但在其他方面并没有提供太多的文档..
最终目标是将 pandoc 用于多格式文档。
tup 不足的唯一原因是它不支持目标。
作为我的构建系统,我正在(或尝试)从出色的tup切换到haskell 摇动。
只有我不知道如何在更改时重建文件。
我当然可以使用 inotify 或像filewatcher甚至watchman这样的包装器。
由于我使用的是抖动,我想知道如何与共享 do 语法的twitch集成,但在其他方面并没有提供太多的文档..
最终目标是将 pandoc 用于多格式文档。
tup 不足的唯一原因是它不支持目标。
首先,您应该编写自己的shake构建规则。然后,当某些源文件将被更改时,您应该运行构建规则来生成目标。
像这样:
main = defaultMain $ do
"src/*.md" |> const build
build = shakeArgs shake{shakeFiles="out"} $ do
want ["out/foo.html", "out/foo.pdf"]
"out/*.html" %> \out -> do
let src = "src" </> dropDirectory1 out -<.> "md"
cmd_ "pandoc -o" [out] src
"out/*.pdf" %> \out -> do
let src = "src" </> dropDirectory1 out -<.> "md"
cmd_ "pandoc -o" [out] src
当src目录中的降价文件将被更改时,out/foo.html将out/foo.pdf被更新。
如果你想优化工作,shake那么你可以这样做:
main = defaultMain $ do
"src/*.md" |> build . dependentTargets
build targets = shakeArgs shake{shakeFiles="out"} $ do
want targets
...
dependentTargets src
| "*.md" ?== src = ["out/foo.html", "out/foo.pdf"]
| otherwise = []
该包twitch建议使用扩展OverloadedStrings来编译代码,如下所示:
"src/*.md" |> ...
但这会导致程序其他部分的代码模棱两可。为了解决这个问题,您可以显式转换String为Dep:
import Data.String
fromString "src/*.md" |> ...
您可以通过重新定义运算符来改进此代码(|>):
import Data.String
import Twitch hiding ((|>))
pattern |> callback = addModify callback $ fromString pattern
"src/*.md" |> ...
我shake用于构建网站并将其包装起来,twitch以便在某些文件更改时重新运行抖动构建。监视函数的主要调用(它用于 forkIO在两个目录中监视,并且每个都可以运行摇)被括号括起来;它还会启动 Web 服务器。
mainWatch :: SiteLayout -> Port -> Path Abs Dir -> IO ()
mainWatch layout bakedPort bakedPath = bracketIO
(do -- first
shake layout
watchDough <- forkIO (mainWatchDough layout) -- calls shake
watchTemplates <- forkIO (mainWatchThemes layout) -- calls shake
scotty bakedPort (site bakedPath)
return (watchDough,watchTemplates) )
(\(watchDough,watchTemplates) -> do -- last
putIOwords ["main2 end"]
killThread watchDough
killThread watchTemplates
return ()
)
(\watch -> do -- during
return ()
)
希望这可以适应您的情况!