Хэкилл говорит: "Обнаружен цикл зависимости: ..."
Я пытаюсь построить сайт с 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
отмеченная страница всегда компилируется позже.