构建一个Haskell项目,方便用户处理;插件;
问题是如何构造Haskell项目,以便允许库的用户提供自己的插件,而不必将自己的代码混合到库的源代码中。让我详细说明一下 假设我有一个名为构建一个Haskell项目,方便用户处理;插件;,haskell,plugins,haskell-stack,template-haskell,Haskell,Plugins,Haskell Stack,Template Haskell,问题是如何构造Haskell项目,以便允许库的用户提供自己的插件,而不必将自己的代码混合到库的源代码中。让我详细说明一下 假设我有一个名为傻瓜ib的库 通过插件类型类提供插件 提供一些(许多)类型,这些类型是插件类的实例 应允许用户创建自己的插件 当然,傻瓜ib的用户可以在傻瓜ib/中添加更多插件。但是傻瓜ib是独立于使用傻瓜ib的应用程序开发的,两者都在单独的SCM下。在这种情况下,将用户的插件混合在doubib/下会违反分离并使源代码控制复杂化。简而言之:在foobar/中混合用户插件当
傻瓜ib
的库
- 通过
类型类提供插件插件
- 提供一些(许多)类型,这些类型是
插件类的实例
- 应允许用户创建自己的插件
傻瓜ib
的用户可以在傻瓜ib/
中添加更多插件。但是傻瓜ib
是独立于使用傻瓜ib
的应用程序开发的,两者都在单独的SCM下。在这种情况下,将用户的插件混合在doubib/
下会违反分离并使源代码控制复杂化。简而言之:在foobar/
中混合用户插件当然是可行的,但无法维护
下面描述了明显的替代方案。用户维护myproject
,添加dublib/
作为git子模块(假设我们正在使用git),并将其插件保存在一个单独的plugins/
目录中。现在的困境来了:所有的插件,即用户的插件和傻瓜ib
中的插件,都在傻瓜ib/src/Core/
中被深层次地使用,并重新暴露给用户——不是直接的,而是伪装的。(假设插件是CMS中的块,其中插件呈现一些HTML,并提供一些最终用户可以在其内容中使用的关键字,这些关键字可以被HTML模板引擎理解。)
一个问题是如何使Haskellstack
处理此设置,同时保持my project/
和Goolib/
的分离
更糟糕的是,有一个模板Haskell(“TH”)正在进行中,它在编译时发现foobar/src/plugins
中的所有插件,并在doubib
的源代码的许多地方使用许多插件的类函数。(这也不是完美的,因为据我所知,导入无法模板化——但这是另一个问题。)
我认为很明显,我在这里介绍的结构不起作用,我看不到一个好的出路。核心问题是,要么我牺牲了傻瓜ib
和我的项目
的分离,要么我最终得到了模板Haskell、sed
、awk
和其他脚本的卷积,这最终会适得其反
非常感谢您提供任何指导。您可以查看Snap框架,因为他们已经使用Snaplet框架解决了这个问题。Snaplet是在外部开发的,Snap是在外部开发的。当您想要创建Snap网站时,可以将Snap和Snaplet导入到应用程序中,然后将它们一起实例化