runhaskell / ghci로 여전히 실행되는 라이브러리 + 실행 파일로 Haskell cabal 프로젝트를 만드는 방법은 무엇입니까?
당신이 경우 라이브러리의 더블 컴파일을 피하면서 음모 파일에 라이브러리 + 실행 섹션을 선언 로 라이브러리를 넣어 hs-source-dirs
디렉토리, 일반적으로 프로젝트를 실행할 수 없습니다 ghci
및 runhaskell
실행 파일이 도우미 모듈 자체가 특히 더 이상.
권장되는 프로젝트 레이아웃은 무엇입니까?
- 한 번만 필요한 것을 빌드합니다.
- 사용 가능
runhaskell
- 해킹이없는 깨끗한 구조를 가지고 있습니까?
mylib
라이브러리 mylib-commandline
와 mylib-server
실행 파일 이 있다고 가정 해 보겠습니다 .
당신이 사용하는 hs-source-dirs
라이브러리와 각각 이중 컴파일을 피하고, 자신의 프로젝트 루트를 가지고 각각의 실행 정도 :
mylib/ # Project root
mylib.cabal
src/ # Root for the library
tests/
mylib-commandline/ # Root for the command line utility + helper modules
mylib-server/ # Root for the web service + helper modules
전체 디렉토리 레이아웃 :
mylib/ # Project root
mylib.cabal
src/ # Root for the library
Web/
Mylib.hs # Main library module
Mylib/
ModuleA # Mylib.ModuleA
ModuleB # Mylib.ModuleB
tests/
...
mylib-commandline/ # Root for the command line utility
Main.hs # "module Main where" stub with "main = Web.Mylib.Commandline.Main.main"
Web/
Mylib/
Commandline/
Main.hs # CLI entry point
Arguments.hs # Programm command line arguments parser
mylib-server/ # Root for the web service
Server.hs # "module Main where" stub with "main = Web.Mylib.Server.Main.main"
Web/
Mylib/
Server/
Main.hs # Server entry point
Arguments.hs # Server command line arguments parser
스텁 같은 진입 점 파일 mylib-commandline/Main.hs
다음과 같다 :
module Main where
import qualified Web.Mylib.Server.Main as MylibServer
main :: IO ()
main = MylibServer.main
executable
는 단순히라는 모듈에서 시작 해야하기 때문에 필요합니다 Main
.
당신의 mylib.cabal
모습은 다음과 같습니다.
library
hs-source-dirs: src
exposed-modules:
Web.Mylib
Web.Mylib.ModuleA
Web.Mylib.ModuleB
build-depends:
base >= 4 && <= 5
, [other dependencies of the library]
executable mylib-commandline
hs-source-dirs: mylib-commandline
main-is: Main.hs
other-modules:
Web.Mylib.Commandline.Main
Web.Mylib.Commandline.Arguments
build-depends:
base >= 4 && <= 5
, mylib
, [other depencencies for the CLI]
executable mylib-server
hs-source-dirs: mylib-server
main-is: Server.hs
other-modules:
Web.Mylib.Server.Main
build-depends:
base >= 4 && <= 5
, mylib
, warp >= X.X
, [other dependencies for the server]
cabal build
라이브러리를 이중 컴파일하지 않고 라이브러리와 두 개의 실행 파일을 빌드합니다. 각각은 자체적으로 hs-source-dirs
있고 실행 파일은 라이브러리에 종속 되기 때문 입니다.
스위치를 사용하여 모듈을 찾을 위치 ( 구분자로 사용) runghc
를 지정하여 프로젝트 루트에서 실행 파일을 계속 실행할 수 있습니다 .-i
:
runhaskell -isrc:mylib-commandline mylib-commandline/Main.hs
runhaskell -isrc:mylib-server mylib-server/Server.hs
이렇게하면 깔끔한 레이아웃, 도우미 모듈이있는 실행 파일, 모든 것이 runhaskell
/ runghc
및 ghci
. 이 플래그를 반복적으로 입력하지 않으려면 다음과 유사한 것을 추가 할 수 있습니다.
:set -isrc:mylib-commandline:mylib-server
to your .ghci
file.
Note that sometimes should split your code into separate packages, e.g. mylib
, mylib-commandline
and mylib-server
.
You can use cabal repl
to start ghci with the configuration from the cabal file and cabal run
to compile and run the executables. Unlike runhaskell
and ghci
, using cabal repl
and cabal run
also picks up dependencies from cabal sandboxes correctly.
ReferenceURL : https://stackoverflow.com/questions/12305970/how-to-make-a-haskell-cabal-project-with-libraryexecutables-that-still-run-with
'programing' 카테고리의 다른 글
불필요한 @SuppressWarnings ( "unused") (0) | 2021.01.14 |
---|---|
Python ImportError는 Ubuntu 12.04 업그레이드 이후 urandom을 가져올 수 없습니다. (0) | 2021.01.14 |
Entity Framework 6에서 분리 된 엔터티 저장 (0) | 2021.01.14 |
React : 키보드 이벤트 핸들러 모두 'Null' (0) | 2021.01.14 |
명시적인 getter 전용 인터페이스 구현에 private setter를 사용하는 것은 왜 불법입니까? (0) | 2021.01.14 |