告诉主要模块所在的cabal

时间:2014-12-21 16:19:57

标签: haskell cabal

我有一个具有这种结构的项目:

foo.cabal
src/
    Foo/
        Main.hs

和foo.cabal的一部分看起来像这样:

executable foo
  main-is:             Foo/Main.hs
  hs-source-dirs:      src

Main.hs的包名为Foo.Main。当我构建它时,cabal会编译所有内容,但不会创建可执行文件,因为它说没有主模块。

Warning: output was redirected with -o, but no output will be generated
because there is no Main module.

我做错了什么?

[编辑]如果我将Main向上移动并将foo.cabal更改为阅读main-is: Main.hs则可行。那么我可以没有Main的嵌套模块名称吗?

1 个答案:

答案 0 :(得分:9)

Main模块必须调用Main,而不是Foo.Main或其他任何内容。如果您需要Foo.Main,请将其中的main重命名为defaultMain,然后创建一个Main的顶级imports Foo.Main (defaultMain)模块并定义main = defaultMain },例如:

src/
    Foo/
        Main.hs
    Main.hs
foo.cabal

其中

-- src/Foo/Main.hs
module Foo.Main
    ( defaultMain
    ) where

defaultMain :: IO ()
defaultMain = putStrLn "Hello, world!"

-- src/Main.hs
module Main where

import Foo.Main (defaultMain)

main :: IO ()
main = defaultMain

或者,您可以保留Foo.Main.main并将其导入合格。