2

我尝试使用shake 将一些markdonw 文件转换为html(“bake”)。降价文件位于目录“dough”中,html 应该转到“baked”。目标是生成index.html链接其他文件的文件。

这是我第一次使用shake!

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

`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
4

2 回答 2

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"相同但更易于阅读。除此之外,它似乎很地道。

于 2019-01-23T19:54:26.347 回答
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

我认为,shake 是一种非常方便的方法,可以为静态站点生成器添加缓存;它只重建需要的东西!

于 2019-01-24T11:24:09.493 回答