애플리케이션의 전체 웹 부분이 하나의 파일에 정의되어 있고 분리해야하는 크기로 성장한 Yesod 애플리케이션이 있습니다. 밖으로 물건.하나의 모듈에 내 경로를 넣고 다른 모듈에 내 핸들러를 넣는 방법
나는이 같은 hirearchy을 설정하려면 :
web/Handlers/Group1
Group2
web/Foundation
web/Main
이것은 Haskellers 웹 사이트의 코드 설정 방법과 유사하다. 그러나 Haskellers 웹 사이트가 실제로 어떻게 작동하는지 알 수 없습니다. 설정을 마치면 Group1의 핸들러가 Foundation 클래스를 가져 와서 다른 경로 목록을 가져와야합니다. 일부 핸들러가 앱의 다른 부분으로 리디렉션되기 때문입니다. 그것은이 분명히 작동하지 않습니다 원형 수입, 나를 강요 등 Group1
, Group2
에 정의 된 경로 처리기,
을 찾기 위해 원하기 때문에하지만 내 Foundation
는 컴파일되지 않습니다. Haskellers 코드를 읽을 때 Foundation
모듈은 Handler
모듈을 가져 오지 않습니다.
이 작업을 수행하는 데 필요한 트릭은 무엇입니까? 마이클 Snoyman의 대답에 따라
업데이트
, 나는myYesodData
및
mkYesodDispatch
에 별도의 호출로
mkYesod
내 전화를 교체했습니다. 나는 하나 개의 파일에 둘 다 할 경우 GHC는 물론, 불평, 그래서 리팩토링의 첫 번째 단계에서 물건을 분리 :
- 웹 부분의 모든 코드를했다
Main.hs
에서 내 코드의 모든 응용 프로그램, 난mkYesodDispatch
전화 나
- 전화 나
WebApp.hs
에서Main.hs
- 다시
WebApp.hs
에서main
함수를 이동WebApp.hs
- 이동
Main.hs
에서
mkYesodData
그리고 링커이 이제 실패합니다.
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
로 돌아 가면 : 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에 mkYesod
로 mkYesodData
를 대체 코드를 편집하는 경우를, 코드가 성공적으로 컴파일 .
참고로, 여기에는 yesod-1.2.4
이 사용됩니다. 1.2.6이 해결하면 내 팀이 업그레이드됩니다.
스캐 폴딩을 사용하고 있습니까? – Sibi
이 프로젝트가 아닙니다. –
스카 폴딩이 도움이 될 것 같습니다. 'config/route' 파일에 모든 경로를 넣을 수 있습니다. 여러분은'Handler' 폴더 아래에서 모든 것을 처리합니다. Yesod에는 자동으로 핸들러를 추가하는 명령이 있습니다. – Sibi