构建一个Haskell项目,方便用户处理;插件;

构建一个Haskell项目,方便用户处理;插件;,haskell,plugins,haskell-stack,template-haskell,Haskell,Plugins,Haskell Stack,Template Haskell,问题是如何构造Haskell项目,以便允许库的用户提供自己的插件,而不必将自己的代码混合到库的源代码中。让我详细说明一下 假设我有一个名为傻瓜ib的库 通过插件类型类提供插件 提供一些(许多)类型,这些类型是插件类的实例 应允许用户创建自己的插件 当然,傻瓜ib的用户可以在傻瓜ib/中添加更多插件。但是傻瓜ib是独立于使用傻瓜ib的应用程序开发的,两者都在单独的SCM下。在这种情况下,将用户的插件混合在doubib/下会违反分离并使源代码控制复杂化。简而言之:在foobar/中混合用户插件当

问题是如何构造Haskell项目,以便允许库的用户提供自己的插件,而不必将自己的代码混合到库的源代码中。让我详细说明一下

假设我有一个名为
傻瓜ib
的库

  • 通过
    插件
    类型类提供插件
  • 提供一些(许多)类型,这些类型是
    插件类的实例
  • 应允许用户创建自己的插件
当然,
傻瓜ib
的用户可以在
傻瓜ib/
中添加更多插件。但是
傻瓜ib
是独立于使用
傻瓜ib
的应用程序开发的,两者都在单独的SCM下。在这种情况下,将用户的插件混合在
doubib/
下会违反分离并使源代码控制复杂化。简而言之:在
foobar/
中混合用户插件当然是可行的,但无法维护

下面描述了明显的替代方案。用户维护
myproject
,添加
dublib/
作为git子模块(假设我们正在使用git),并将其插件保存在一个单独的
plugins/
目录中。现在的困境来了:所有的插件,即用户的插件和
傻瓜ib
中的插件,都在
傻瓜ib/src/Core/
中被深层次地使用,并重新暴露给用户——不是直接的,而是伪装的。(假设插件是CMS中的块,其中插件呈现一些HTML,并提供一些最终用户可以在其内容中使用的关键字,这些关键字可以被HTML模板引擎理解。)

一个问题是如何使Haskell
stack
处理此设置,同时保持
my project/
Goolib/
的分离

更糟糕的是,有一个模板Haskell(“TH”)正在进行中,它在编译时发现
foobar/src/plugins
中的所有插件,并在
doubib
的源代码的许多地方使用许多插件的类函数。(这也不是完美的,因为据我所知,导入无法模板化——但这是另一个问题。)

我认为很明显,我在这里介绍的结构不起作用,我看不到一个好的出路。核心问题是,要么我牺牲了
傻瓜ib
我的项目
的分离,要么我最终得到了模板Haskell、
sed
awk
和其他脚本的卷积,这最终会适得其反


非常感谢您提供任何指导。

您可以查看Snap框架,因为他们已经使用Snaplet框架解决了这个问题。Snaplet是在外部开发的,Snap是在外部开发的。当您想要创建Snap网站时,可以将Snap和Snaplet导入到应用程序中,然后将它们一起实例化