哈基尔说:“检测到依赖性循环:......”

时间:2016-02-26 07:03:56

标签: haskell hakyll

我正在尝试构建一个包含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 个答案:

答案 0 :(得分:2)

通过调用public class Test { public static void main(String[] args) { List<Person> persons = Arrays.asList( new Person("e1", "l1"), new Person("e2", "l1"), new Person("e3", "l2"), new Person("e4", "l2") ); List<Employee> employees = persons.stream() .filter(p -> p.getLastName().equals("l1")) .map(p -> new Employee(p.getName(), p.getLastName(), 1000)) .collect(Collectors.toList()); System.out.println(employees); } } class Person { private String name; private String lastName; public Person(String name, String lastName) { this.name = name; this.lastName = lastName; } // Getter & Setter } class Employee extends Person { private double salary; public Employee(String name, String lastName, double salary) { super(name, lastName); this.salary = salary; } // Getter & Setter } ,您可以在编译当前版本之前加载每个完全编译的帖子,因此它是一个循环依赖项。

最直接的解决方案是定义帖子的另一个版本:

loadAll "posts/*"

然后你可以加载它们而不会触发循环依赖:

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

但是,您可能必须从文件路径手动生成正确的URL,而不同的版本是具有不同URL的不同页面。如果为多个页面设置相同的路由,则编译的最后一个将覆盖所有其他页面。

在你的情况下没关系,因为非标记版本依赖于“titleLine”版本,因此稍后编译,但通常对不同页面具有相同的路由是危险的,没有这样的依赖match "posts/*" $ do -- route compile $ do postList <- loadAll ("posts/*" .&&. hasVersion "titleLine") -- render the page 标记页面是总是在以后编译。