作为我的构建系统,我正在(或尝试)从出色的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 ()
)
希望这可以适应您的情况!