摇动-规则已完成运行,但未生成文件:

时间:2019-01-23 15:29:30

标签: shake-build-system

我尝试使用摇动将一些markdonw文件转换为html(“烘烤”)。降价文件位于“面团”目录中,并且html应当进入“烘焙”目录。目标是产生index.html文件,该文件链接其他文件。

这是我第一次使用摇动!

转换有效,但最后第一条规则产生了错误

`rule finished running but did not produce file:`

原因可能是index.html文件是在第二条规则之前生成的。我怎样才能告诉第一个规则不要期望结果(或再次强制生产)?

第二个问题:如何更改第一个规则以收集扩展名为“ md”和“ markdown”的文件?

谢谢您的帮助!欢迎提出改进建议!

bakedD  = "site/baked" -- toFilePath bakedPath
doughD = "site/dough"

shakeWrapped :: IO  ()
shakeWrapped = shakeArgs shakeOptions {shakeFiles=bakedD
                , shakeVerbosity=Loud
                , shakeLint=Just LintBasic
                } $
    do
        want ["index"<.>"html"]

        "index"<.>"html" %> \out ->
            do
                mds <- getDirectoryFiles  doughD ["//*.md"] 
                let htmlFiles = [bakedD </> md -<.> "html" | md <- mds]

                need htmlFiles
                liftIO $  bakeOneFileIO  "baked/index.html"

        (bakedD <> "//*.html") %> \out ->
            do
                let c = dropDirectory1 $ out -<.> "md"
                liftIO $  bakeOneFileIO  c

2 个答案:

答案 0 :(得分:0)

该错误消息指出,您声明了要产生index.html的文件,但没有产生该文件。通过阅读您的构建系统,它似乎会产生based/index.html?如果是这样,请将want行区域更改为:

do
    want ["baked/index.html"]

    "baked/index.html" %> \out ->

现在您说的是在执行结束时要生成文件baked/index.html,这是生成baked/index.html的规则。 (如果它确实产生site/baked/index.html,则进行适当调整。)

解决第二个问题,mds <- getDirectoryFiles doughD ["//*.md","//*.markdown"]将同时检测到两个扩展名。

关于样式提示,使用"index" <.> "html"并没有真正帮助-"index.html"相同,但更易于阅读。除此之外,这似乎很惯用。

答案 1 :(得分:0)

问题是第一个规则需要一个文件,但是第二个规则包含(并产生了)该文件。有迹象表明,在这种有问题的情况下,该规则未使用\out变量,并且不需要产生index.htm(因为它包含在第二条规则中)。可以将其视为一种假性规则适当并简化代码的指示:

bakedD  = "site/baked" -- toFilePath bakedPath
doughD = "site/dough"

shakeWrapped :: IO  ()
shakeWrapped = shakeArgs shakeOptions {shakeFiles=bakedD
                , shakeVerbosity=Loud
                , shakeLint=Just LintBasic
                } $
    do
        want ["allMarkdownConversion"]

        phony "allMarkdownConversion" $  
            do
                mds <- getDirectoryFiles  doughD ["//*.md"] -- markdown ext ??
                let htmlFiles = [bakedD </> md -<.> "html" | md <- mds]
--                liftIO $ putIOwords ["shakeWrapped - htmlFile", showT htmlFiles]
                need htmlFiles

        (bakedD <> "//*.html") %> \out ->
            do
                let c = dropDirectory1 $ out -<.> "md"
                liftIO $  bakeOneFileIO  c

我认为抖动是一种将缓存添加到静态站点生成器的非常方便的方法;它只会重建所需的内容!