Хэкилл говорит: "Обнаружен цикл зависимости: ..."

Я пытаюсь построить сайт с 7 страницами. Каждая страница определяется с помощью ввода.markdown. На каждой странице я хочу заголовок со ссылками на все другие страницы.

Теперь это кажется невозможным, поскольку Хэкилл говорит мне, что у меня рекурсивная зависимость.

[ERROR] Hakyll.Core.Runtime.chase: Dependency cycle detected: posts/page1.markdown depends on posts/page1.markdown

Я определил рекурсивную зависимость от этого фрагмента.

match "posts/*" $ do
    route $ setExtension "html"
    compile $ do
        posts <- loadAll "posts/*"
        let indexCtx =
                listField "posts" postCtx (return posts) `mappend`
                constField "title" "Home"                `mappend`
                defaultContext

        pandocCompiler >>= loadAndApplyTemplate "templates/post.html" indexCtx
              >>= loadAndApplyTemplate "templates/default.html" indexCtx
              >>= relativizeUrls

Я предполагаю, что проблема в том, что мне не разрешено совпадать с тем же шаблоном, на котором выполняется загрузка.

Итак, как я могу создать контекст с listField для всех сообщений, которые будут использоваться при создании сообщений.

Я полагаю, что альтернативой было бы сначала создать ссылки, как-то их сохранить, а затем включить в посты. Но как мне это сделать?

1 ответ

По телефону loadAll "posts/*" вы загружаете каждый полностью скомпилированный пост перед компиляцией текущего, так что это циклическая зависимость.

Самое простое решение - определить другую версию ваших сообщений:

match "posts/*" $ version "titleLine" $ do
  -- route
  -- compiler, maybe generate a link to real page here from file path

Затем вы можете загрузить их все, не вызывая циклическую зависимость:

match "posts/*" $ do
  -- route
  compile $ do
    postList <- loadAll ("posts/*" .&&. hasVersion "titleLine")
    -- render the page

Но вам, возможно, придется вручную генерировать правильный URL-адрес из пути к файлу, ведь другая версия - это другая страница с другим URL-адресом. Если вы установите одну и ту же маршрутизацию для более чем одной страницы, последняя скомпилированная перезапишет все остальные.

Это нормально в вашем случае, так как версия без тега зависит от версии "titleLine", поэтому компилируется позже, но обычно опасно иметь одинаковую маршрутизацию для разных страниц без такой зависимости. version отмеченная страница всегда компилируется позже.

Другие вопросы по тегам