Haskell 如何将路由放在一个模块中,将处理程序放在另一个模块中
我有一个YesSOD应用程序,其中应用程序的整个web部分都定义在一个文件中,并且它的大小已经发展到我需要将内容分离出来的程度 我想建立一个像这样的雇佣关系:Haskell 如何将路由放在一个模块中,将处理程序放在另一个模块中,haskell,yesod,Haskell,Yesod,我有一个YesSOD应用程序,其中应用程序的整个web部分都定义在一个文件中,并且它的大小已经发展到我需要将内容分离出来的程度 我想建立一个像这样的雇佣关系: web/Handlers/Group1 Group2 web/Foundation web/Main 这与Haskellers网站的代码设置类似。然而,我不知道Haskellers网站是如何运作的。当我设置时,GROP1中的处理程序需要导入Foundation来获取基础类并获取其他路由列表,因为我的一些处理程序
web/Handlers/Group1
Group2
web/Foundation
web/Main
这与Haskellers网站的代码设置类似。然而,我不知道Haskellers网站是如何运作的。当我设置时,GROP1中的处理程序需要导入Foundation来获取基础类并获取其他路由列表,因为我的一些处理程序重定向到应用程序的不同部分。但是我的基金会不会编译,因为它想找到在GROP1、GROP2等中定义的路由处理程序< /P>
这迫使我进行循环导入,这显然行不通。当我读取HaskeleS代码时,基础模块不导入任何处理模块。
让这项工作成功的诀窍是什么
更新
根据Michael Snoyman的回答,我已经将对mkYesod的呼叫替换为对MyYesOData和mkYesodDispatch的单独呼叫。当然,GHC会抱怨,如果我在一个文件中同时做这两件事,那么我会在重构的第一阶段将内容分离出来:
我从Main.hs获得的所有代码,也就是应用程序web部分的所有代码,我移动到了WebApp.hs
我将main函数从WebApp.hs移回main.hs
在WebApp.hs中,我调用mkYesodData
在Main.hs中,我呼叫mkYesodDispatch
链接器现在失败了。编译Main时,它在导入列表中找到的第一个模块(它位于此项目中,而不是库中)无法链接,如下所示:
web/Main.hs:1:1:
cannot find normal object file `dist/build/invoicedb/invoicedb-tmp/WebApp.o'
while linking an interpreted expression
如果我删除mkYesodDispatch和mkYesodData并返回到mkYesod,即使使用相同的文件结构,构建也会顺利进行
因此,要回顾一下,以下是我的文件:
web/Main.hs:
主要功能
给mkYesodDispatch的电话
配置/路由:
纯文本路由,就像在scaffold应用程序中一样
web/WebApp.hs:
我的应用程序结构
MKYESODATA
应用程序实例
实例YesDouth应用程序
实例RenderMessage应用程序FormMessage
我所有的路由处理程序
我创建了一个简单的例子来说明这个问题:
如果编辑代码,在DSPACHCH.HS中注释MKEESOTDRISH,并在Foundation.hs中用MKEESOD替换MKEESODATA,则代码将成功编译。
注意,我使用的是yesod-1.2.4。如果1.2.6解决了这个问题,那么我将升级我的团队。我猜您的代码正在使用对mkYesod的调用。为了将一个模块拆分为多个模块,您需要使用mkYesodData,mkyesodas是在scaffolding站点中完成的。有关这方面的更多信息,请参阅。将此技术应用于现有的代码库应该不会太困难。我猜您的代码正在使用对mkYesod的调用。为了将一个模块拆分为多个模块,您需要使用mkYesodData,mkyesodas是在scaffolding站点中完成的。有关这方面的更多信息,请参阅。将此技术应用于现有的代码库应该不会太困难。这看起来像是.cabal文件中的一个bug。确保您告诉cabal您正在使用模板Haskell:
executable yesod-decomposition
..
other-extensions: TemplateHaskell
这样它就知道如何以正确的顺序构建正确的对象文件。这看起来像是.cabal文件中的一个bug。确保您告诉cabal您正在使用模板Haskell:
executable yesod-decomposition
..
other-extensions: TemplateHaskell
这样它就知道如何以正确的顺序构建正确的对象文件。您是否使用脚手架?不适用于此项目。我认为脚手架将帮助您。您可以将所有路由放在config/route文件中。所有处理程序都位于处理程序文件夹下。Yesod有自动添加处理程序的命令。我已经有上千行代码,没有时间过渡到一个全新的体系结构。你在使用脚手架吗?不是为了这个项目。我认为脚手架将帮助你。您可以将所有路由放在config/route文件中。所有处理程序都位于处理程序文件夹下。Yesod有自动添加处理程序的命令。我已经有超过一千行的代码了,没有时间过渡到一个全新的体系结构。