заговор, модуль и зависимости

#haskell #cabal

#haskell #заговор

Вопрос:

Мне было интересно, когда вы загружаете и устанавливаете пакет через cabal, пытается ли cabal собрать все или только то, что вам нужно. Например, многие пакеты включают в себя и модуль HaskellTemplate, для которого, очевидно, требуется расширение HaskellTemplate. Что произойдет, если вы используете компилятор, который не поддерживает это расширение, но не заботится об этом модуле, потому что вы все равно его не используете?

Комментарии:

1. Когда проект компилируется, компилируется каждый файл в проекте, который является экспортированным модулем или зависимостью экспортированного модуля. Если компилятор, например Hugs, не поддерживает более новое расширение, подобное TypedHoles , то компиляция завершится неудачей.

2. Хорошо, тогда лучше поместить, например, «th»-й модуль в совершенно отдельный пакет.

3. Вы также могли бы взглянуть на условную компиляцию (подробнее здесь ), которая позволила бы вам просто хранить их в разных модулях и условно экспортировать определенные из них в зависимости от используемого компилятора.

Ответ №1:

Когда вы cabal install загружаете пакет из hackage, cabal также необходимо установить все зависимости этого пакета.

Обычно компилируются все файлы в пакете. Однако есть несколько исключений:

  1. Cabal по умолчанию не создает наборы тестов или бенчмарки.
  2. Если пакет имеет флаги, некоторые модули могут быть отключены, если установлены / отменены определенные флаги. Могут существовать зависимости, которые защищены флагом, и 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 может решать , какой флаг использовать. Есть ли способ создать что-то, только если зависимость присутствует, но без установки, если нет (хотя это можно было бы сделать за конечный промежуток времени)