не может определить несколько исполняемых файлов - PullRequest
0 голосов
/ 12 июня 2018

У меня есть два файла в папке app

app/
|-- Main.hs
|-- SomeFunc2.hs

SomeFunc2.hs просто для печати другой строки

module SomeFunc2 where

import Lib

main :: IO ()
main = putStrLn "someFunc2"

Когда я определяю несколько исполняемых файлов в package.yamlвот так

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

  somefunc2-exe:
    main:                SomeFunc2.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - multiexes

Я получил ошибку:

▸ stack build
Building all executables for `multiexes' once. After a successful build of all of them, only specified executables will be rebuilt.
multiexes-0.1.0.0: configure (lib + exe)
Configuring multiexes-0.1.0.0...
multiexes-0.1.0.0: build (lib + exe)
Preprocessing library for multiexes-0.1.0.0..
Building library for multiexes-0.1.0.0..
[2 of 2] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/Lib.o )
Preprocessing executable 'multiexes-exe' for multiexes-0.1.0.0..
Building executable 'multiexes-exe' for multiexes-0.1.0.0..
[1 of 3] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe-tmp/Main.o ) [Lib changed]
[3 of 3] Compiling SomeFunc2        ( app/SomeFunc2.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe-tmp/SomeFunc2.o )
Linking .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe ...
Preprocessing executable 'somefunc2-exe' for multiexes-0.1.0.0..
Building executable 'somefunc2-exe' for multiexes-0.1.0.0..
Warning: Enabling workaround for Main module 'Main' listed in 'other-modules'
illegaly!
[1 of 2] Compiling Paths_multiexes  ( .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/autogen/Paths_multiexes.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/somefunc2-exe-tmp/Paths_multiexes.o )
[2 of 2] Compiling SomeFunc2        ( app/SomeFunc2.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/somefunc2-exe-tmp/SomeFunc2.o )

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


--  While building custom Setup.hs for package multiexes-0.1.0.0 using:
      /Users/leo/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.0.1.0_ghc-8.2.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.0.1.0 build lib:multiexes exe:multiexes-exe exe:somefunc2-exe --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1

Как это исправить?Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Нашел решение, если я создаю папку для каждого исполняемого файла и в каждой папке есть Main.hs, то это работает.

app/
|-- Main.hs
somefunc2/
|-- Main.hs

В package.yaml измените исходные каталоги наэти папки:

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

  somefunc2-exe:
    main:                Main.hs
    source-dirs:         somefunc2
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - multiexes
0 голосов
/ 12 июня 2018

Модуль, который содержит основную функцию и должен стать исполняемым файлом, должен иметь имя Main, как в

module Main (main) where

. Вы также можете полностью опустить объявление модуля для того же эффекта.Ваша проблема в

module SomeFunc2 where

Это соглашение указано в отчете Haskell , и хотя GHC позволяет изменить имя модуля , содержащее main, Cabal не .

Чтобы процитировать последнюю ссылку:

Кроме того, хотя имя файла может отличаться, сам модуль должен иметь имя Main.

Так что в этом случае можно назвать модуль Main (или опустить объявление имени модуля), даже если сам файл не называется Main.hs.

...