2016-02-26 34 views
2

我正在嘗試構建一個包含7個頁面的站點。每個頁面都使用.markdown輸入定義。在每個頁面上,我想要一個包含所有其他頁面鏈接的標題。Hakyll說:「檢測到依賴週期:...」

現在,這似乎是不可能的,因爲Hakyll告訴我,我有一個遞歸依賴項。

[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的上下文,以便在生成帖子時使用所有帖子。

我想一個替代方法是首先生成鏈接,以某種方式存儲它們,然後將它們包含在帖子中。但我該怎麼做?

回答

2

通過調用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。如果您爲多個頁面設置相同的路由,則編譯的最後一個將覆蓋所有其他頁面。

由於未標記的版本取決於「標題行」版本,因此稍後編譯,但通常對於不同的頁面具有相同的路由是很危險的,沒有這種依賴關係。 。

+0

它應該可能是hasVersion而不是setVersion,對吧? – nesqi

+0

@nesqi抱歉,修正。 – zakyggaps

+0

鑑於「titleLine」版本使用相同的路由,URL將是正確的。 – nesqi