#haskell #cabal
#haskell #заговор
Вопрос:
Мне было интересно, когда вы загружаете и устанавливаете пакет через cabal, пытается ли cabal собрать все или только то, что вам нужно. Например, многие пакеты включают в себя и модуль HaskellTemplate, для которого, очевидно, требуется расширение HaskellTemplate. Что произойдет, если вы используете компилятор, который не поддерживает это расширение, но не заботится об этом модуле, потому что вы все равно его не используете?
Комментарии:
1. Когда проект компилируется, компилируется каждый файл в проекте, который является экспортированным модулем или зависимостью экспортированного модуля. Если компилятор, например Hugs, не поддерживает более новое расширение, подобное
TypedHoles
, то компиляция завершится неудачей.2. Хорошо, тогда лучше поместить, например, «th»-й модуль в совершенно отдельный пакет.
3. Вы также могли бы взглянуть на условную компиляцию (подробнее здесь ), которая позволила бы вам просто хранить их в разных модулях и условно экспортировать определенные из них в зависимости от используемого компилятора.
Ответ №1:
Когда вы cabal install
загружаете пакет из hackage, cabal также необходимо установить все зависимости этого пакета.
Обычно компилируются все файлы в пакете. Однако есть несколько исключений:
- Cabal по умолчанию не создает наборы тестов или бенчмарки.
- Если пакет имеет флаги, некоторые модули могут быть отключены, если установлены / отменены определенные флаги. Могут существовать зависимости, которые защищены флагом, и cabal автоматически попытается отключить / включить флаг, если он не может удовлетворить зависимости с включенным флагом.
Чтобы проиллюстрировать пункт 2, рассмотрим следующее определение пакета:
name: foo
version: 0.1
flag withGHC
default: True
manual: False # Allow cabal to figure out the correct value for the flag automatically
library
exposed-modules:
Foo.Bar # This will always be compiled
if flag(withGHC)
build-depends: ghc
exposed-modules:
Foo.GHC # This will only be compiled when withGHC is True
Теперь, при установке foo
под GHC, cabal обнаружит, что он может сортировать зависимости даже с включенным флагом, поэтому Foo.GHC
будет собран.
Но если вы попытаетесь установить foo
с помощью другого компилятора, cabal увидит, что при выборе withGHC = True
это приводит к зависимости ghc
, которую он не может удовлетворить. Таким образом, он будет выбран withGHC = False
и Foo.GHC
не будет собран.
Комментарии:
1. Я не понимал, что cabal может решать , какой флаг использовать. Есть ли способ создать что-то, только если зависимость присутствует, но без установки, если нет (хотя это можно было бы сделать за конечный промежуток времени)