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