如何使仍与runhaskell / ghci的运行库+可执行Haskell的阴谋计划?(How to

2019-06-27 22:47发布

如果你在一个小集团文件中声明库+可执行部分,而避免了图书馆的双重编译通过把图书馆变成一个hs-source-dirs目录下,你通常不能与运行项目ghcirunhaskell了,特别是如果可执行文件有帮手模块本身。

什么是推荐的项目布局

  • 只有建立需要一次什么
  • 允许使用runhaskell
  • 有一个干净的结构而不黑客?

Answer 1:

让我们假设你有一个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

.ghci文件。


请注意,有时应该分裂你的代码软件包,例如: mylibmylib-commandlinemylib-server



Answer 2:

您可以使用cabal repl与来自阴谋文件和配置开始ghci的cabal run编译并运行可执行文件。 不像runhaskellghci ,用cabal replcabal run也拿起从阴谋沙箱正确的依赖关系。



文章来源: How to make a Haskell cabal project with library+executables that still run with runhaskell/ghci?