Как я могу настроить Cabal для сборки двух исполняемых файлов? - PullRequest
2 голосов
/ 02 апреля 2020

Я пытаюсь построить Haskell проект , используя Cabal. У меня есть файл src / Main.hs, который содержит модуль Main и функцию main. Этот файл запускает веб-интерфейс моего приложения. И у меня есть другой файл, src / CLI.hs, который содержит модуль CLI и функцию main. Я могу просто запустить его с runhaskell CLI ..., но я не могу скомпилировать его с помощью cabal.

Дело в том, что даже если я укажу CLI.hs в качестве основного файла (main-is: CLI.hs), он все равно компилирует проект с main из src / Main.hs, тем самым давая мне веб-приложение вместо CLI.

Я хочу иметь возможность компилировать два исполняемых файла, один из которых является веб-приложением, а другой - CLI, указав точки входа каждого из них как main в CLI.hs и main в Main .hs соответственно.

Вот сегмент файла .cabal, который я использую в данный момент:

executable color-word-analyzer-cli
  main-is:           CLI.hs
  other-modules:     AnnotateColors
                   , CategorizeColor
                   , ColorMaps
                   , FindColors
                   , PlotColors
                   , Types
                   , Main
  build-depends:       base
                     , lucid
                     ...
                     , wai-middleware-static
  hs-source-dirs:      src/
  default-language:    Haskell2010

executable color-word-analyzer-web
  main-is:           Main.hs
  other-modules:     AnnotateColors
                   , CategorizeColor
                   , ColorMaps
                   , FindColors
                   , PlotColors
                   , Types
                   , CLI
  build-depends:     base
                   , lucid
                     ...
                   , wai-middleware-static
  hs-source-dirs:      src/
  default-language:    Haskell2010

, который выдает ошибку (среди прочих):

Building executable 'color-word-analyzer-cli' for color-word-analyzer-0.1.0.0..
Warning: Enabling workaround for Main module 'Main' listed in 'other-modules'
illegally!

<no location info>: warning: [-Wmissing-home-modules]
    These modules are needed for compilation but not listed in your .cabal file's other-modules: 
        Main

, который забавно, так как Main явно указан там в other-modules.

Я использую cabal версии 3.0.0.0 и gh c версии 8.8.2.

1 Ответ

1 голос
/ 02 апреля 2020

Полностью явная форма единицы компиляции - <package>:<category>:<ident>, где в случае пакетов color-word-analyzer, категория exe, а identif - исполняемые файлы. Так что для вашего случая вы можете позвонить:

cabal build color-word-analyzer:exe:color-word-analyzer-cli color-word-analyzer:exe:color-word-analyzer-web

Теперь вам на самом деле не нужно указывать все это. Когда исполняемый файл уникален, тот факт, что это исполняемый файл (а не, скажем, тест из какого-либо другого пакета или другого имени самого пакета), и тот факт, что он исходит из color-word-analyzer, очевидны в этом контексте. Поэтому вы можете позвонить:

 cabal build color-word-analyzer-cli color-word-analyzer-web

РЕДАКТИРОВАТЬ: потому что ваша ссылка не имела раздел для -web Я использовал одно из моих собственных созданий, которое не включает модуль CLI. Обратите внимание, что ваш CLI файл module Main, что объясняет ошибку, которую вы видите - вы не можете включить модуль Main в качестве библиотечного модуля.

...