2014-01-21 45 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 

因此它知道以正確的順序構建正確的目標文件。

相關問題