我有一個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