2014-01-21 44 views
1

我有一个Yesod应用程序,其中应用程序的整个Web部分都定义在一个文件中,并且它已经增长到需要分离的大小事情了。如何将路由放在一个模块中,我的处理程序放在另一个模块中

我想建立一个hirearchy这样的:

web/Handlers/Group1 
      Group2 
web/Foundation 
web/Main 

这类似于如何为Haskellers网站的代码设置。但是,我无法弄清Haskellers网站是如何运作的。当我开始设置时,Group1中的处理程序需要导入Foundation来获取Foundation类并获取其他路由列表,因为我的一些处理程序会重定向到应用程序的不同部分。但我的Foundation不会编译,因为它想要找到Group1,Group2等中定义的路由处理程序。

这迫使我进入循环导入,这显然不起作用。当我阅读Haskellers代码时,Foundation模块不会导入任何Handler模块。

使这项工作有什么窍门?


更新

继迈克尔Snoyman的回答,我已经更换了我的电话,以mkYesod具有独立调用myYesodDatamkYesodDispatch。 GHC抱怨,当然,如果我在一个文件中都做,所以我在一个重构的第一阶段分离的东西了:

  • 我所有的代码Main.hs,这是所有的网络部分的代码申请后,我搬到WebApp.hs
  • 我感动main功能从WebApp.hsMain.hs
  • WebApp.hs我打电话mkYesodData
  • Main.hs我打电话mkYesodDispatch

连接器现在失败。当编译Main,第一模块找到导入列表,这是在这个项目中,而不是在图书馆未能像这样链接:如果我放弃mkYesodDispatchmkYesodData,回到mkYesod,即使使用

web/Main.hs:1:1: 
    cannot find normal object file `dist/build/invoicedb/invoicedb-tmp/WebApp.o' 
    while linking an interpreted expression 

这个相同的文件结构,构建完美。

所以,回顾一下,这里是我的文件:

web/Main。HS:

  • main功能
  • 的调用mkYesodDispatch

配置/路线:

  • 纯文本路由,就像在支架应用

web/WebApp.hs:

  • App结构
  • mkYesodData
  • 例如耶索德应用
  • 例如YesodAuth应用
  • 例如RenderMessage应用FormMessage
  • 我所有的路由处理程序

我创建了说明了这个问题一个简单的例子: https://bitbucket.org/savannidgerinel/yesod-decomposition/src/

[2 of 3] Compiling Dispatch   (src/Dispatch.hs, dist/build/yesod-decomposition/yesod-decomposition-tmp/Dispatch.p_o) 
src/Dispatch.hs:1:1: 
    cannot find normal object file `dist/build/yesod-decomposition/yesod-decomposition-tmp/Foundation.o' 
    while linking an interpreted expression 

如果您编辑代码,在Dispatch.hs注释掉mkYesodDispatch,并与Foundation.hs mkYesod更换mkYesodData,代码将成功编译。

请注意,我为此使用了yesod-1.2.4。如果1.2.6解决了这个问题,那么我会升级我的团队。

+0

你在使用脚手架吗? – Sibi

+0

不适用于此项目。 –

+0

我认为脚手架会帮助你。你可以把所有的路由放在'config/route'文件中。所有你在'Handler'文件夹下处理。 Yesod有自动添加处理程序的命令。 – Sibi

回答

4

我猜你的代码正在使用致电mkYesod。为了分成多个模块,您需要像在脚手架站点中那样使用mkYesodDatamkYesodDispatch。欲了解更多信息,请参阅scaffolding chapter。使这种技术适应现有的代码库不应该太难。

2

这看起来像您的.cabal文件中的错误。确保您告诉cabal您正在使用模板Haskell:

executable yesod-decomposition 
    .. 
    other-extensions: TemplateHaskell 

因此它知道以正确的顺序构建正确的目标文件。

相关问题