如果你在一个小集团文件中声明库+可执行部分,而避免了图书馆的双重编译通过把图书馆变成一个hs-source-dirs
目录下,你通常不能与运行项目ghci
和runhaskell
了,特别是如果可执行文件有帮手模块本身。
什么是推荐的项目布局
- 只有建立需要一次什么
- 允许使用
runhaskell
- 有一个干净的结构而不黑客?
如果你在一个小集团文件中声明库+可执行部分,而避免了图书馆的双重编译通过把图书馆变成一个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
您.ghci
文件。
请注意,有时应该分裂你的代码软件包,例如: mylib
, mylib-commandline
和mylib-server
。
您可以使用cabal repl
与来自阴谋文件和配置开始ghci的cabal run
编译并运行可执行文件。 不像runhaskell
和ghci
,用cabal repl
和cabal run
也拿起从阴谋沙箱正确的依赖关系。