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

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

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

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

3 ответа

Решение

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

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

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

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

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

Так, например, если у вас есть две библиотеки с cabal-файлами, которые выглядят так:

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

Это возможно в 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/ содержит некоторую информацию по этому вопросу.

Другие вопросы по тегам