Haskell与Twitch一起摇晃?

Hao*_*eke 3 haskell build pandoc shake-build-system

我正在切换(或尝试)从辉煌的tuphaskell摇动作为我的构建系统..

只有我无法弄清楚如何在变化时重建文件.

我当然可以使用inotify或像filewatcher甚至是守望者这样的包装器.

因为我正在使用摇动,我想知道如何与twitch共享do语法,但在其他方面没有提供太多的文档..

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

tup不充分的唯一原因是因为它不支持目标.

fre*_*yle 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
Run Code Online (Sandbox Code Playgroud)

当在降价文件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 = []
Run Code Online (Sandbox Code Playgroud)

该软件包twitch建议使用扩展名OverloadedStrings来编译代码,如下所示:

"src/*.md" |> ...
Run Code Online (Sandbox Code Playgroud)

但这会导致程序其他部分的代码含糊不清.要修复它,您可以显式转换StringDep这样:

import Data.String

fromString "src/*.md" |> ...
Run Code Online (Sandbox Code Playgroud)

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

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

pattern |> callback = addModify callback $ fromString pattern

"src/*.md" |> ...
Run Code Online (Sandbox Code Playgroud)