3

作为我的构建系统,我正在(或尝试)从出色的tup切换到haskell 摇动。

只有我不知道如何在更改时重建文件。

我当然可以使用 inotify 或像filewatcher甚至watchman这样的包装器。

由于我使用的是抖动,我想知道如何与共享 do 语法的twitch集成,但在其他方面并没有提供太多的文档..

最终目标是将 pandoc 用于多格式文档。

tup 不足的唯一原因是它不支持目标。

4

2 回答 2

5

首先,您应该编写自己的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.htmlout/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" |> ...

但这会导致程序其他部分的代码模棱两可。为了解决这个问题,您可以显式转换StringDep

import Data.String

fromString "src/*.md" |> ...

您可以通过重新定义运算符来改进此代码(|>)

import Data.String
import Twitch hiding ((|>))

pattern |> callback = addModify callback $ fromString pattern

"src/*.md" |> ...
于 2017-11-09T13:03:53.387 回答
1

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 ()
            )

希望这可以适应您的情况!

于 2019-02-08T23:38:38.883 回答