Сборка нескольких исполняемых файлов в проекте стека Haskell по умолчанию - PullRequest
4 голосов
/ 23 апреля 2020

Я использовал значение по умолчанию stack new, чтобы настроить проект с сервером и клиентом в качестве отдельных исполняемых файлов. Я изменил файл package.yaml, как кажется, правильным образом (по состоянию на 21 апреля 2020 года " Руководство пользователя " отсутствует) и добавил в мой каталог app новый файл с именем Client.hs .

Я получил сообщение об ошибке: «Включение обходного пути для основного модуля« 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

1 Ответ

2 голосов
/ 23 апреля 2020

Здесь есть две проблемы. Во-первых, значением по умолчанию для other-modules в hpack является «все модули в source-dirs, кроме main и модулей, упомянутых в предложении when». Если вы посмотрите на сгенерированный файл .cabal, то увидите, что в результате этого значения по умолчанию каждый исполняемый файл неправильно включил модуль другого исполняемого файла в свой список other-modules. Во-вторых, настройка main дает исходный файл, который содержит основной модуль, но не меняет имя модуля, ожидаемого GH C, с Main на что-либо другое. Следовательно, этот модуль по-прежнему должен называться module Main where ..., а не module Client where..., если только вы не добавите отдельно -main-is Client GH C параметр.

Итак, я хотел бы посоветуйте изменить 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

Это, кажется, работает в моем тестировании .

...