Как определить многократные исполняемые файлы / основные модули со стеком / hpack - PullRequest
0 голосов
/ 11 января 2019

Я использую стек и файл package.yaml для hpack для компиляции моего проекта на haskell. Он имеет три исполняемых файла, поддерживаемых одной библиотекой. Как и следовало ожидать, все исполняемые файлы определяют модуль Main:

$ head -n1 app/*
==> app/Foo.hs <==
module Main where

==> app/Bar.hs <==
module Main where

==> app/Baz.hs <==
module Main where

И я использую этот package.yaml, который очень похож (* мне) на тот, который связан с официальными документами для hpack (третий).

name: myproject
dependencies:
  - base
library:
  source-dirs: src
executables:
  foo:
    main: Foo.hs
    source-dirs: app
    dependencies: myproject
  bar:
    main: Bar.hs
    source-dirs: app
    dependencies: myproject
  baz:
    main: Baz.hs
    source-dirs: app
    dependencies: myproject

Но когда я stack build получаю ошибку, то имя модуля не совпадает имя файла:

Building all executables for `myproject' once. After a successful build of all of them, only specified executables will be rebuilt.
myproject-0.0.0: build (lib + exe)
Preprocessing library for myproject-0.0.0..
Building library for myproject-0.0.0..
[1 of 2] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1/build/Lib.o )
[2 of 2] Compiling Paths_myproject  ( .stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1/build/autogen/Paths_myproject.hs, .stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1/build/Paths_myproject.o )
Preprocessing executable 'bar' for myproject-0.0.0..
Building executable 'bar' for myproject-0.0.0..

/home/luc/test/app/Baz.hs:1:8: error:
    File name does not match module name:
    Saw: ‘Main’
    Expected: ‘Baz’
  |
1 | module Main where
  |        ^^^^


--  While building package myproject-0.0.0 using:
      /home/luc/.stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_mPHDZzAJ_2.2.0.1_ghc-8.4.4 --builddir=.stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1 build lib:myproject exe:bar exe:baz exe:foo --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1

Единственной разницей между моей установкой и примером, который я нашел, были заглавные буквы файлов в app/. И действительно, если я изменю их на нижний регистр (в файловой системе и package.yaml), все будет построено правильно.

Но почему это и где это задокументировано?

1 Ответ

0 голосов
/ 24 января 2019

Я думаю, app не следует считать условным обозначением папки всех конечных приложений. В своих проектах я всегда разделяю их на foo/Main.hs и bar/Main.hs для foo и bar целей. Следовательно, package.yaml должен содержать

executables:
  foo:
    main:                Main.hs
    source-dirs:         foo
    dependencies:
    - myproject
  bar:
    main:                Main.hs
    source-dirs:         bar
    dependencies:
    - myproject

И относитесь к myproject как к библиотеке для них

...