Haskell 哈斯凯尔颤抖着抽搐?

Haskell 哈斯凯尔颤抖着抽搐?,haskell,build,pandoc,shake-build-system,Haskell,Build,Pandoc,Shake Build System,我正在将(或试图)从卓越转换为我的构建系统 只是我不知道如何让shake在更改时重建文件 我当然可以使用inotify或类似的包装纸,甚至可以 由于我使用的是shake,所以我想知道如何与do语法的共享集成,但在其他方面没有提供太多文档 最终目标是将pandoc用于多格式文档 tup不足的唯一原因是它不支持目标。首先,您应该编写自己的shake构建规则。然后,当某些源文件将被更改时,您应该运行构建规则来生成目标 像这样: main = defaultMain $ do "src/*.md"

我正在将(或试图)从卓越转换为我的构建系统

只是我不知道如何让shake在更改时重建文件

我当然可以使用inotify或类似的包装纸,甚至可以

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

最终目标是将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

twitch
建议对如下编译代码使用扩展名
OverloadedStrings

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 = []
"src/*.md" |> ...
import Data.String

fromString "src/*.md" |> ...
但这会导致程序其他部分的代码模棱两可。为了解决这个问题,您可以显式地将
String
转换为
Dep
,如下所示:

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 = []
"src/*.md" |> ...
import Data.String

fromString "src/*.md" |> ...
您可以通过重新定义
(|>)
运算符来改进此代码:

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

pattern |> callback = addModify callback $ fromString pattern

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

我使用
shake
构建网站,并将其包装到
twitch
中,以便在某些文件更改时重新运行shake构建。监视函数的主要调用(它使用
forkIO
在两个目录中监视,每个目录都可以运行shake)被括起来;它还启动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 ()
            )

mainWatch::SiteLayout->Port->Path Abs Dir->IO()
main watch布局bakedPort bakedPath=括号IO
(你先
震动布局
你要做什么
返回()
)

希望这能适应你的情况

不知何故,我得到的是无法将'do{“src/*.md”|>const build}的类型'[Char]'与'DepM()'匹配使用扩展名
OverloadedString
{-#LANGUAGE OverloadedString}
)用于隐式转换
String->Dep
Data.String.fromString
用于显式转换。这会导致
由文本“pandoc-o”产生的不明确类型变量“t1”阻止约束(Data.String.IsString t1)得到解决。在表达式中:do{let src=“src”dropDirectory1 out-“md”;cmd“pandoc-o”[out]src}
如果我太过冗长,请原谅。我更新了答案,并提供了修复该问题的建议。