shake - правило завершено, но файл не выдан: - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь использовать Shake, чтобы конвертировать некоторые файлы markdonw в html («выпекать»).Файлы уценки находятся в каталоге «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

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Проблема заключалась в том, что первое правило хочет файл, но этот файл включается (и создается) вторым правилом. В этом проблемном случае есть указание на то, что переменная \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 - очень удобный способ добавить кеш в генератор статических сайтов; он восстанавливает только то, что требуется!

0 голосов
/ 23 января 2019

В сообщении об ошибке указывается, что вы объявляете файл для выдачи 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" идентично, но более понятно для чтения. Кроме этого, это выглядит довольно идиоматично.

...