我有一个Yesod应用程序,其中应用程序的整个Web部分都定义在一个文件中,并且它已经增长到需要分离的大小事情了。如何将路由放在一个模块中,我的处理程序放在另一个模块中
我想建立一个hirearchy这样的:
web/Handlers/Group1
Group2
web/Foundation
web/Main
这类似于如何为Haskellers网站的代码设置。但是,我无法弄清Haskellers网站是如何运作的。当我开始设置时,Group1中的处理程序需要导入Foundation来获取Foundation类并获取其他路由列表,因为我的一些处理程序会重定向到应用程序的不同部分。但我的Foundation
不会编译,因为它想要找到Group1
,Group2
等中定义的路由处理程序。
这迫使我进入循环导入,这显然不起作用。当我阅读Haskellers代码时,Foundation
模块不会导入任何Handler
模块。
使这项工作有什么窍门?
更新
继迈克尔Snoyman的回答,我已经更换了我的电话,以mkYesod
具有独立调用myYesodData
和mkYesodDispatch
。 GHC抱怨,当然,如果我在一个文件中都做,所以我在一个重构的第一阶段分离的东西了:
- 我所有的代码
Main.hs
,这是所有的网络部分的代码申请后,我搬到WebApp.hs
- 我感动
main
功能从WebApp.hs
回Main.hs
- 在
WebApp.hs
我打电话mkYesodData
- 在
Main.hs
我打电话mkYesodDispatch
而连接器现在失败。当编译Main
,第一模块找到导入列表,这是在这个项目中,而不是在图书馆未能像这样链接:如果我放弃mkYesodDispatch
和mkYesodData
,回到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解决了这个问题,那么我会升级我的团队。
你在使用脚手架吗? – Sibi
不适用于此项目。 –
我认为脚手架会帮助你。你可以把所有的路由放在'config/route'文件中。所有你在'Handler'文件夹下处理。 Yesod有自动添加处理程序的命令。 – Sibi