Что означает "не указанная версия" в моей сборке 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 уже включают его.
Таким образом, я предлагаю следующее:
Создать отдельный
stack.yaml
только для ночного распознавателя, назовите его как-нибудь еще, например, у вас уже есть такойstack-nightly.yaml
packages: - . extra-deps: - 'MissingH-1.4.0.1'
Установите переменную среды, чтобы указать
stack-nightly.yaml
когда распознаватель - ночной, может быть:env: ... - $RESOLVER=nightly STACK_YAML=stack-nightly.yaml # Not sure of the syntax.
В противном случае вы можете использовать
--stack-yaml
опция командной строки.