Haskell 哈斯凯尔颤抖着抽搐?
我正在将(或试图)从卓越转换为我的构建系统 只是我不知道如何让shake在更改时重建文件 我当然可以使用inotify或类似的包装纸,甚至可以 由于我使用的是shake,所以我想知道如何与do语法的共享集成,但在其他方面没有提供太多文档 最终目标是将pandoc用于多格式文档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"
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}
如果我太过冗长,请原谅。我更新了答案,并提供了修复该问题的建议。