我有一个带有几个可执行文件(测试,基准等)的Haskell库,总共约为六个。当我在库中进行一些重构时,我通常需要对每个可执行文件进行一些小更改。
在当前的工作流程中,我分别编译每个可执行文件(例如,使用GHCI)并修复每个可执行文件。这很乏味,因为我必须输入到每个可执行文件的路径,而且必须重新加载所有(非常大的)库,即使在GHCI中,这些库也需要一些时间。
我第一个解决此问题的想法是创建一个单个虚拟模块,该模块导入可执行的"主"模块。但是,这(当然)要求"主"模块具有module Executable1 where ...
之类的模块名称。但是现在,Cabal在编译可执行文件时抱怨它找不到一个称为" MAIN"的模块(尽管在每个可执行文件中明确列出了" Main-is",但每个可执行文件都列出了" Main-is"。)
我也尝试了ghci Exec1.hs Exec2.hs ...
,但它抱怨module ‘main@main:Main’ is defined in multiple files
。
是否有一种简单的方法可以同时使用GHCI加载多个"主"模块,以便我可以同时进行打字?
Cabal的main-is
选项仅告诉Cabal它应该将其传递给GHC的文件名。Cabal不在乎其模块名称。
GHC本身也有一个也称为-main-is
的标志,在此处记录,该标志告诉编译器哪个模块main
函数。
所以这有效:
executable foo
main-is: Foo.hs
ghc-options: -main-is Foo
当然Foo.hs
应从module Foo where…
开始,并导出main
。像往常一样,模块名称和文件名需要匹配。
这样,所有可执行文件都可以具有不同的模块名称,并且您可以将它们全部加载到GHCI中。
如果您还想更改主函数的名称,请写ghc-options: -main-is Foo.fooMain
。我猜您什至可以让所有可执行文件具有相同的模块,但是不同的 main
-functions this。