はあなたがmylib
ライブラリを持っていると仮定しましょう、とmylib-commandline
とmylib-server
実行可能。
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
スタブのようなそれぞれが二重のコンパイルを避け、自分のプロジェクトルートを持つように
あなたはライブラリと、各実行のためhs-source-dirs
を使用しますエントリポイントファイルmylib-commandline/Main.hs
は次のようになります。
module Main where
import qualified Web.Mylib.Server.Main as MylibServer
main :: IO()
main = MylibServer.main
executable
は、単にMain
と呼ばれるモジュールで開始する必要があるため、それらが必要です。
あなたmylib.cabal
は次のようになります。それぞれが自分のhs-source-dirs
であると実行可能ファイルがライブラリに依存しているため
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
は、ライブラリーのダブルコンパイルすることなく、ライブラリと2つの実行を構築します。あなたはまだそれが(セパレータとして:
を使用して)モジュールを探しならない場所を教えて-i
スイッチを使用して、プロジェクトのルートからrunghc
で実行可能ファイルを実行することができます
:
runhaskell -isrc:mylib-commandline mylib-commandline/Main.hs
runhaskell -isrc:mylib-server mylib-server/Server.hs
この方法は、あなたが持つことができますクリーンなレイアウト、ヘルパーモジュールを持つ実行ファイル、そしてすべてはまだrunhaskell
/runghc
とghci
で動作します。繰り返しこのフラグを入力しないようにするには、あなたの.ghci
ファイルに
:set -isrc:mylib-commandline:mylib-server
に似た何かを追加することができます。
コードを別々のパッケージに分割する必要があります。 mylib
,mylib-commandline
およびmylib-server
。
パーフェクトな答え、私は公式のハスケルページでこのような単純で直接的な記事を探していたが、運がない。おそらく、私は検索に十分な時間を費やさなかったかもしれませんが、これは私を助けました。ありがとうございました! – korCZis