Haskell 是否可能依赖于shake build中的内存值(而不是文件)?
我正在使用Haskell 是否可能依赖于shake build中的内存值(而不是文件)?,haskell,shake-build-system,Haskell,Shake Build System,我正在使用shake编写一个静态站点生成器,并试图实现一种有效的方法来持久化站点导航(以及每个页面的一些元数据)。这比我想象的要复杂得多: 站点元数据是一个树数据结构,其中树中的每个节点都是永久链接,以及页面的元数据,如标题、简短简介、作者等 几乎所有页面都使用此站点元数据来呈现站点范围的导航(在标题或边栏中) 每当修改页面时,其生成规则都会修改站点元数据中自己的节点 完整的站点元数据存储在一个文件中(与每个页面元数据的单个文件相反) 如果在每个页面的构建操作结束时更新站点元数据,则会导致站
shake
编写一个静态站点生成器,并试图实现一种有效的方法来持久化站点导航(以及每个页面的一些元数据)。这比我想象的要复杂得多:
- 站点元数据是一个树数据结构,其中树中的每个节点都是永久链接,以及页面的元数据,如标题、简短简介、作者等
- 几乎所有页面都使用此站点元数据来呈现站点范围的导航(在标题或边栏中)
- 每当修改页面时,其生成规则都会修改站点元数据中自己的节点
- 完整的站点元数据存储在一个文件中(与每个页面元数据的单个文件相反)
IORef
,并在每个页面的构建操作结束时更新内存中的IORef
然而,这可能导致两个问题:
- 如何使
规则依赖于此sitemap.xml
,如何确保它在最后运行IORef
- 如何使每个页面依赖于此
,因为这里实际上存在循环依赖关系-每个页面都依赖并更新站点元数据IORef
如果我已经让它变得更加复杂,那么什么是一种替代的,但有效的实现方法?首先,在优化之前,可能值得再次检查您的假设,即序列化等是昂贵的。在许多情况下,这并没有那么大的问题。但是让我们继续假设它太贵了 最大的问题是循环依赖性。如果你能设计出来,在抖动中有很多解决方案可以避免重复序列化等等。我会考虑将依赖性设计为:
newCache
消除,它可以引入对文件反序列化形式的依赖性-规则仍然依赖于文件,但通过应用的转换
最后,如果使用上述公式,您可能希望步骤2直接生成侧边栏/顶边栏内容,然后也可以共享呈现这些功能的所有工作。首先,在优化之前,可能需要再次检查您的假设,即序列化等非常昂贵。在许多情况下,这并没有那么大的问题。但是让我们继续假设它太贵了 最大的问题是循环依赖性。如果你能设计出来,在抖动中有很多解决方案可以避免重复序列化等等。我会考虑将依赖性设计为:
newCache
消除,它可以引入对文件反序列化形式的依赖性-规则仍然依赖于文件,但通过应用的转换
最后,如果使用上述公式,您可能希望步骤2直接生成侧栏/顶栏内容,然后也可以共享渲染这些功能的所有工作