Кабал с несколькими разделами библиотеки

Возможно ли написать файл конфигурации Cabal, содержащий несколько Library sections?

Я нашел в документацию описание раздела и Executables , < поэтому кажется, что невозможно поставить больше раздела библиотеки в один файл конфигурации Cabal.

Но что мне делать, если я разрабатываю несколько библиотек Haskell и несколько исполняемых файлов одновременно и хотите их компилировать и тестировать?

Ответ 1

Я узнал, что моя проблема может быть легко решена с помощью новейшего cabal-dev.

Если у вас есть 2 проекта: A и B, и вы хотите их развернуть параллельно, его приятно использовать cabal-dev install A B - он будет строить и устанавливать их как в локальный репозиторий cabal-dev. Если вы запустите эту команду, они будут перестроены и переустановлены, если необходимо.

В соответствии с документацией. Если вы хотите зарегистрировать новый или переопределить существующий пакет в локальном хакете cabal-dev, вы должны использовать cabal-dev add-source, которые в основном копируют исходный код и позволяют установить его, как это было доступно на hackage.

Ответ 2

AFAIK, вы не можете поместить более одной библиотеки в файл cabal. Имя, указанное в поле Name (на верхнем уровне файла cabal), используется как имя библиотеки, поэтому механизм указания имен дополнительных библиотек не существует.

На практике я не нашел, что это проблема. Я разрабатываю каждую библиотеку в отдельном каталоге с собственным файлом. После запуска cabal install в библиотеке, которую вы разработали, на нее можно ссылаться в файле cabal для вашего исполняемого файла (в разделе Build-Depends), точно так же, как пакет в Hackage.

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

Name:              my-library-1
. . .

и

Name:              my-library-2
. . .

Затем файл cabal для вашего исполняемого файла может ссылаться на них следующим образом:

Name:              my-program
. . .
Executable run-program
Main-Is:          Main.hs
Build-Depends:    my-library1,
                  my-library2,
                  . . .

Вы даже можете потребовать определенные версии своих библиотек. Например:

Build-Depends:    my-library1==1.2.*,
                  my-library2>=1.3

Ответ 3

Это возможно в Cabal 2 с внутренними библиотеками, так называемыми "удобными" библиотеками: https://github.com/haskell/cabal/pull/3022. Это не позволит вам устанавливать эти библиотеки, но их просто можно скомпоновать в финальные исполняемые файлы и публичную библиотеку, открытую файлом .cabal. Если вы хотите создать несколько вещей в процессе, вы должны использовать файл cabal.project - http://blog.ezyang.com/2016/05/announcing-cabal-new-build-nix-style-local-builds/ содержит некоторую информацию об этом.