programing

runhaskell / ghci로 여전히 실행되는 라이브러리 + 실행 파일로 Haskell cabal 프로젝트를 만드는 방법은 무엇입니까?

copyandpastes 2021. 1. 14. 23:36
반응형

runhaskell / ghci로 여전히 실행되는 라이브러리 + 실행 파일로 Haskell cabal 프로젝트를 만드는 방법은 무엇입니까?


당신이 경우 라이브러리의 더블 컴파일을 피하면서 음모 파일에 라이브러리 + 실행 섹션을 선언 로 라이브러리를 넣어 hs-source-dirs디렉토리, 일반적으로 프로젝트를 실행할 수 없습니다 ghcirunhaskell실행 파일이 도우미 모듈 자체가 특히 더 이상.

권장되는 프로젝트 레이아웃은 무엇입니까?

  • 한 번만 필요한 것을 빌드합니다.
  • 사용 가능 runhaskell
  • 해킹이없는 깨끗한 구조를 가지고 있습니까?

mylib라이브러리 mylib-commandlinemylib-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/ runghcghci. 이 플래그를 반복적으로 입력하지 않으려면 다음과 유사한 것을 추가 할 수 있습니다.

: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

반응형