10

我有一个相当简单的haskell项目设置,我只想让框架在我真正开始编码之前进行测试等等。我在一个/src目录中有可执行文件的源文件(/项目的根目录在哪里),在一个/testsuite目录中有我的测试。/testsuite包含一个简单的测试文件,称为TestSuite.hswithmain = Test.Framework.defautMain tests作为 main 的实现。问题是,当我跑步时

cabal clean && cabal configure --enable-tests && cabal build

我收到警告

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

当我不指定时,构建工作正常--enable-tests。我的阴谋文件是:

Name:                Example
Version:             0.1
Synopsis:            Synopsis
Description:
    Long description.
License:             GPL
License-File:        LICENSE
Author:              SeanK
Maintainer:          email@example.com
Category:            Development
Build-Type:          Simple
Cabal-Version:       >= 1.8

Test-Suite test
    Type:               exitcode-stdio-1.0
    Main-Is:            TestSuite.hs
    Build-Depends:      base >= 3 && < 5,
                        test-framework,
                        test-framework-quickcheck
                        -- QuickCheck
    Hs-Source-Dirs:     src,
                        testsuite

Executable example
    Main-Is:            Main.hs
    -- Other-Modules:       
    Build-Depends:      base >= 3 && < 5,
                        haskell98
    Hs-Source-Dirs:     src
    Ghc-Options:        -Wall

我禁用了 QuickCheck,因为我目前没有使用 (==>),这是我目前需要的唯一功能。其余的应该是直截了当的。任何帮助将不胜感激。

4

3 回答 3

17

您应该在TestSuite.hs文件中将模块名称定义为Main,例如那里

引用Haskell 98 报告

Haskell 程序是一组模块,按照惯例,其中一个必须称为 Main 并且必须导出值 main。

于 2012-08-26T20:43:25.433 回答
4

TestSuite您可以添加一个 GHC 选项来将主模块的名称设置为 Cabal 文件,而不是像 Fedor 建议的那样重命名模块:

Test-Suite testFedor
    ghc-options:    -main-is TestSuite

显然,Cabalmain-is和 GHCmain-is是不同的。我不知道以什么方式。

于 2016-06-16T16:55:48.213 回答
0

如果您使用的是与hpack兼容的系统,例如 Stack、cabal2nix 或只是该hpack工具,您可以.cabal从文件生成package.yaml文件。executables:对于in下的条目,package.yaml您可以指定以main:以下两种方式之一工作的键:

  1. 给定一个.hs文件名,该文件名将直接复制到main-is:生成的 Cabal 文件的行中,提供 Cabal 语义。

  2. 给定一个模块名称或模块和导出的定义名称(例如,FooFoo.startup),适当的ghc-options: -main-is ...将被添加到生成的 Cabal 文件中,并且main-is:将是从模块名称(例如main-is: Foo.hs)生成的文件名。

如果您不想使用 apackage.yaml但难以让 Cabal 文件正常工作,则可能仍然值得设置一个临时的、最小的package.yaml并在其上运行hpack以查看它产生的输出并确认您是以同样的方式编写你的 Cabal 文件。

对于它的价值,这是我最近的一个项目中的一个exectuables:部分的示例:package.yaml

executables:
  hello:
    source-dirs: src/
    main: Hello.main

以及我生成的.cabal文件中的相关代码片段:

executable hello
  main-is: Hello.hs
  hs-source-dirs:
    src/
  ghc-options: -main-is Hello
于 2022-01-26T03:34:14.410 回答