Что означает "не указанная версия" в моей сборке Cabal?

Недавняя сборка Travis CI для разработки моего пакета на Haskell сообщает об ошибке

MissingH должен соответствовать>=1.3.0.1, но у конфигурации стека нет указанной версии (последняя совпадающая версия - 1.4.0.1)

при сборке для GHC 8.6.1, хотя у меня есть

MissingH >=1.3.0.1 

в моем build-depends,

Я не понимаю эту ошибку: она кажется противоречивой. У меня нет верхнего предела для MissingH, так почему он выдает ошибку и не использует последнюю версию?

1 ответ

Вам нужно добавить MissingH в stack.yaml,

extra-deps:
  - 'MissingH-1.4.0.1'
  • Ваша посылка *.cabal В файле указано, какие версии зависимостей совместимы с вашим пакетом. Это слабая спецификация, не все комбинации на самом деле могут работать (потому что они могут иметь противоречивые границы для транзитивных зависимостей или есть непредвиденный сбой в конкретной версии, с которой вы не тестировали).

  • По сравнению, stack.yaml описывает конкретный снимок пакетов, прикрепленных к конкретным версиям. Это точно говорит, что "мой пакет, как известно, работает с этими версиями". Конечно, поддерживать версию каждой зависимости утомительно, и для этого команда Stackage поддерживает "преобразователь", курируемый набор версий пакетов, о которых известно, что они работают вместе, которые можно использовать для указания версии многих пакетов одновременно., установив resolver: поле stack.yaml соответственно. Средство распознавания перечисляет только подмножество пакетов в Hackage, поэтому, когда одна из ваших зависимостей отсутствует, вам нужно добавить ее в свой stack.yaml как extra-dep,


Обновление: после обсуждения необходимы некоторые дополнительные сведения о настройке travis.

Во-первых, мое текущее предпочтительное решение для CI проектов на Haskell - не беспокоиться о стеке и использовать вместо него https://github.com/haskell-CI/haskell-ci который генерирует сценарий travis с использованием cabal-install.

Теперь о менее радикальном решении.

В настоящее время сценарий Тревиса меняется только --resolver вариант, но, насколько я могу судить, нет опции командной строки для добавления extra-dep. Похоже на то stack.yaml файлы являются единственным способом для этого. Кроме того, мы хотим только указать MissingH в качестве дополнительного депозита для последних ночных вечеринок, потому что LTS уже включают его.

Таким образом, я предлагаю следующее:

  1. Создать отдельный stack.yaml только для ночного распознавателя, назовите его как-нибудь еще, например, у вас уже есть такой stack-nightly.yaml

    packages:
    - .
    extra-deps:
    - 'MissingH-1.4.0.1'
    
  2. Установите переменную среды, чтобы указать stack-nightly.yaml когда распознаватель - ночной, может быть:

    env:
    ...
    - $RESOLVER=nightly STACK_YAML=stack-nightly.yaml
    # Not sure of the syntax.
    

    В противном случае вы можете использовать --stack-yaml опция командной строки.

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