一个多模Haskell可执行文件与共享库的单独可执行文件

时间:2014-05-23 15:53:48

标签: haskell cabal

我正在开发一个项目,我在其中配置cabal文件以构建几个可执行文件,这些可执行文件共享由同一个cabal文件构建的库。 cabal项目的结构与this one类似,其中一个library部分后跟多个executable部分,其build-depends部分中包含此库。

我正在使用这种方法,因此我可以为任意数量的可执行文件提供常用功能,并根据需要轻松创建更多可执行文件。

然而在他的Monad Reader article on Hoogle p.33中,Neil Mitchell主张将Haskell项目捆绑成一个具有多种模式的可执行文件(例如,通过使用Neil Mitchell的CmdArgs库。)因此可能有一种模式可以启动Web服务器,另一种从命令行查询数据库的模式等。引用:

  

提供一个可执行文件

     

版本3有四个可执行程序 - 一个用于生成排名   信息,一个做命令行搜索,一个做web   搜索,一个做回归测试。版本4有一个   可执行文件,完成上述所有操作,由fl ags控制。   提供一个终端程序有很多好处 - 它   它可以减少代码破坏的几率而不会注意到它,它可以实现   不重复Haskell运行时系统,总文件大小更小,   它减少了用户需要学习的命令数量。搬到了   一个多功能可执行文件似乎是一个常见的主题,哪些工具   例如darcs和hpc都基于一个带有多个命令的命令   模式。

单个多模可执行文件真的是更好的方法吗?有没有相反的理由坚持使用共享同一个库的单独的可执行文件?

1 个答案:

答案 0 :(得分:1)

就个人而言,我更喜欢Unix哲学的粉丝“写程序做一件事,做得好”。但是有理由做任何一种方式,所以这里唯一合理的答案是:它取决于。

当您将所有内容捆绑到同一个可执行文件中的一个示例是,当您的目标是资源非常有限的平台(例如,嵌入式系统)时。这是BusyBox采取的方法。

另一方面,如果您分成多个可执行文件,您可以让客户选择只使用对它们有用的文件。使用单个可执行文件,即使您的客户真的只想要一个功能,他也无法摆脱额外的行李。

我确信无论采用哪种方式还有很多理由,但这只是表明没有明确的答案。这取决于用例。