繁体   English   中英

在默认 Haskell 堆栈项目中构建多个可执行文件

[英]Building multiple executables in the default Haskell Stack project

我使用默认stack new来设置一个项目,该项目具有一个服务器和一个客户端作为单独的可执行文件。 我以正确的方式更改了package.yaml文件(截至 2020 年 4 月 21 日“没有用户指南”),并在我的app目录中添加了一个名为Client.hs的新文件。

我收到一条错误消息,提示“非法启用在 'other-modules' 中列出的主模块 'Main' 的解决方法!”

如何同时构建客户端和服务器的堆栈?

当我运行stack build时,我得到:

[... clip ...]
Building executable 'ObjectServer' for ObjectServer-0.1.0.1..
[4 of 4] Compiling Client
Linking .stack-work\dist\29cc6475\build\ObjectServer\ObjectServer.exe ...
Warning: Enabling workaround for Main module 'Main' listed in 'other-modules'
illegally!
Preprocessing executable 'Client' for ObjectServer-0.1.0.1..
Building executable 'Client' for ObjectServer-0.1.0.1..
[3 of 3] Compiling Client

<no location info>: error:
    output was redirected with -o, but no output will be generated
because there is no Main module.


--  While building package ObjectServer-0.1.0.1 using:
      D:\HaskellStack\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_3.0.1.0_ghc-8.8.3.exe --builddir=.stack-work\dist\29cc6475 build lib:ObjectServer exe:Client exe:ObjectServer --ghc-options " -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1

package.yaml的相关部分如下所示:

executables:
  ObjectServer:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - ObjectServer
  Client:
    main:                Client.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - ObjectServer

这里有两个问题。 首先, hpackother-modules的默认值是“ source-dirs中的所有模块,除了mainwhen子句中提到的模块”。 如果您查看生成的.cabal文件,您会发现由于此默认设置,每个可执行文件都错误地将其他可执行文件的模块包含在其other-modules列表中。 其次, main设置提供了包含主模块的源文件,但不会将 GHC 期望的模块名称从Main更改为其他任何内容。 因此,该模块仍然需要命名为module Main where... ,而不是module Client where... ,除非您也单独添加-main-is Client GHC 选项。

因此,我建议修改Client.hs以使其成为Main模块:

-- in Client.hs
module Main where
...

然后为两个可执行文件明确指定other-modules: []

executables:
  ObjectServer:
    main:                Main.hs
    other-modules:       []
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - ObjectServer
  Client:
    main:                Client.hs
    other-modules:       []
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - ObjectServer

这似乎在我的测试中有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM