2016-12-03 2 views
4

У меня есть библиотека Haskell с несколькими исполняемыми файлами (тесты, тесты и т. Д.), Всего около шести. Когда я делаю рефакторинг в библиотеке, мне обычно нужно внести небольшое изменение в каждый из исполняемых файлов.Typechecking multiple 'Main's

В моем текущем рабочем процессе я отдельно компилирую каждый исполняемый файл (скажем, с помощью GHCi) и исправляю каждый. Это утомительно, потому что я должен указать путь к каждому исполняемому файлу и, кроме того, перезагрузить всю (очень большую) библиотеку, которая даже с GHCi занимает некоторое время.

Моей первой мыслью решить эту проблему было создание единственного фиктивного модуля, который импортирует исполняемые «Основные» модули. Однако это (конечно) требует, чтобы модули «Main» имели имя модуля, например module Executable1 where .... Но теперь каблят жалуется при компиляции исполняемого файла, что он не может найти модуль под названием «Main» (несмотря на то, что в файле cabal для каждого исполняемого файла явно указано «main-is»).

Я также пробовал ghci Exec1.hs Exec2.hs ..., но он жалуется module ‘[email protected]:Main’ is defined in multiple files.

Есть ли простой способ загрузить сразу несколько «основных» модулей с помощью GHCi, чтобы я мог их проверять одновременно?

ответ

6

Параметр Cabal's main-is сообщает Cabal, какое имя файла он должен передать GHC. Cabal не заботится об этом имени модуля.

У самого GHC есть флаг, также называемый -main-is, documented here, который сообщает компилятору, что модуль поддерживает функцию main.

Так это работает:

executable foo 
    main-is: Foo.hs 
    ghc-options: -main-is Foo 

Конечно Foo.hs следует начинать с module Foo where… и экспортировать main. Как обычно, имя модуля и имя файла должны совпадать.

Таким образом, все исполняемые файлы могут иметь разные имена модулей, и вы можете загрузить их все в GHCi.

Если вы также хотите изменить название основной функции, напишите ghc-options: -main-is Foo.fooMain. Я бы предположил, что вы можете даже иметь все исполняемые файлы с тем же модулем, но разные main -функции таким образом.

+0

Это спасет меня так много времени! Спасибо! – crockeea

+0

Работает ли он по назначению? Я действительно не тестировал его –

+0

Это действительно так. Предостережения: ваше имя файла должно совпадать с именем модуля, и вы должны экспортировать 'main' – crockeea