2014-01-21 4 views
1

애플리케이션의 전체 웹 부분이 하나의 파일에 정의되어 있고 분리해야하는 크기로 성장한 Yesod 애플리케이션이 있습니다. 밖으로 물건.하나의 모듈에 내 경로를 넣고 다른 모듈에 내 핸들러를 넣는 방법

나는이 같은 hirearchy을 설정하려면 :

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

이것은 Haskellers 웹 사이트의 코드 설정 방법과 유사하다. 그러나 Haskellers 웹 사이트가 실제로 어떻게 작동하는지 알 수 없습니다. 설정을 마치면 Group1의 핸들러가 Foundation 클래스를 가져 와서 다른 경로 목록을 가져와야합니다. 일부 핸들러가 앱의 다른 부분으로 리디렉션되기 때문입니다. 그것은이 분명히 작동하지 않습니다 원형 수입, 나를 강요 등 Group1, Group2에 정의 된 경로 처리기,

을 찾기 위해 원하기 때문에하지만 내 Foundation는 컴파일되지 않습니다. Haskellers 코드를 읽을 때 Foundation 모듈은 Handler 모듈을 가져 오지 않습니다.

이 작업을 수행하는 데 필요한 트릭은 무엇입니까? 마이클 Snoyman의 대답에 따라


업데이트

, 나는 myYesodDatamkYesodDispatch에 별도의 호출로 mkYesod 내 전화를 교체했습니다. 나는 하나 개의 파일에 둘 다 할 경우 GHC는 물론, 불평, 그래서 리팩토링의 첫 번째 단계에서 물건을 분리 :

  • 웹 부분의 모든 코드를했다 Main.hs에서 내 코드의 모든 응용 프로그램, 난 mkYesodDispatch
  • 전화 나 Main.hs에서 mkYesodData
  • 전화 나 WebApp.hs에서 Main.hs
  • 다시 WebApp.hs에서 main 함수를 이동 WebApp.hs
  • 이동

그리고 링커이 이제 실패합니다.

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

심지어 사용 mkYesodDispatchmkYesodData을 드롭 mkYesod로 돌아 가면 : Main를 컴파일 할 때, 첫 번째 모듈 그것은 도서관에서이 프로젝트와없는 가져 오기 목록에서 찾은 것은과 같이 연결 실패 이 동일한 파일 구조는 빌드가 완벽하게 진행됩니다.

검토하려면 다음 파일을 제출하십시오.

web/Main.HS :

  • main 기능
  • 호출

mkYesodDispatch을 설정/경로 :

  • 일반 텍스트 라우팅, 단지 발판 응용 프로그램에서 같은

web/WebApp.hs :

  • App 구조
  • mkYesodData
  • 예를 Yesod 앱
  • 인스턴스 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에 mkYesodmkYesodData를 대체 코드를 편집하는 경우를, 코드가 성공적으로 컴파일 .

참고로, 여기에는 yesod-1.2.4이 사용됩니다. 1.2.6이 해결하면 내 팀이 업그레이드됩니다.

+0

스캐 폴딩을 사용하고 있습니까? – Sibi

+0

이 프로젝트가 아닙니다. –

+0

스카 폴딩이 도움이 될 것 같습니다. 'config/route' 파일에 모든 경로를 넣을 수 있습니다. 여러분은'Handler' 폴더 아래에서 모든 것을 처리합니다. Yesod에는 자동으로 핸들러를 추가하는 명령이 있습니다. – Sibi

답변

4

귀하의 코드가 mkYesod으로 전화를 사용하고 있다고 생각합니다. 여러 개의 모듈로 분할하려면 스 캐 폴딩 사이트에서와 같이 mkYesodDatamkYesodDispatch을 사용해야합니다. 이에 대한 자세한 내용은 scaffolding chapter을 참조하십시오. 기존의 코드베이스로 작업 할 때이 기술을 적용하는 것이 너무 어렵지 않아야합니다.

2

.cabal 파일의 버그처럼 보입니다. 당신이 템플릿 하스켈을 사용하는 것을 음모를 말해 있는지 확인합니다 : 그것은 올바른 순서로 적절한 오브젝트 파일을 구축 할 알고

executable yesod-decomposition 
    .. 
    other-extensions: TemplateHaskell 

그래야.