【问题标题】:Cabal output is redirected but not generatedCabal 输出被重定向但未生成
【发布时间】:2012-08-26 19:44:46
【问题描述】:

我有一个相当简单的 haskell 项目设置,我只想让框架在我真正开始编码之前进行测试等工作。我在/src 目录(其中/ 是项目的根目录)中有可执行文件的源文件,在/testsuite 目录中有我的测试。 /testsuite 包含一个名为 TestSuite.hs 的简单测试文件,main = 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,因为我目前没有使用 (==>),这是我目前需要的唯一功能。其余的应该是直截了当的。任何帮助将不胜感激。

【问题讨论】:

    标签: testing haskell build cabal


    【解决方案1】:

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

    引用The Haskell 98 Report:

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

    【讨论】:

    • 哇,这个要求真的需要在错误输出中突出显示。编译几乎没有提示问题是什么。我认为用 main-is 指出模块就足够了。
    • @worldsayshi 在我在源代码 (myProgram.lhs) 中明确为我的模块命名 (MyProgram) 后,我得到了 a similar problem,但如果我在 ghc 命令中添加 -main-is MyProgram.main (ghc -Wall myProgram -main-is MyProgram.main),它会生成可执行文件 (./myProgram)。与您的观察相反,-main-is 还不够。对于裸ghc,在我的情况下就足够了,也许,如果编译是由cabal完成的,就像你的情况一样。
    【解决方案2】:

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

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

    显然 Cabal main-is 和 GHC main-is 是不同的。不知道是什么方式。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

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

      executable hello
        main-is: Hello.hs
        hs-source-dirs:
          src/
        ghc-options: -main-is Hello
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-25
        • 2021-09-09
        • 2011-08-31
        • 2010-11-13
        • 2023-04-07
        • 2013-05-18
        • 1970-01-01
        • 2021-11-04
        相关资源
        最近更新 更多