Сборка учебного примера по Споку не удалась - PullRequest
1 голос
/ 11 апреля 2020

Я хотел немного поработать с Haskell и поэтому взглянул на структуру Спока. Чтобы начать чистку, я удалил все Haskell, связанное с моей машиной Arch Linux, и установил ghcup, Cabal и Stack, используя сценарии установки с соответствующих веб-сайтов.

Теперь я хочу следовать Учебнику Спока . Попытка установить Спока глобально с cabal install Spock, как предложено, выдает ошибку (сокращенно):

src/Web/Spock/Internal/Wire.hs:43:1: error:
    Could not find module ‘Web.Routing.AbstractRouter’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
   |
43 | import Web.Routing.AbstractRouter
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cabal: Failed to build Spock-0.9.0.1. See the build log above for details.

Я уже нашел вопрос по reddit на topi c, но Решение не применяется, потому что я не пытаюсь использовать указанную c версию библиотек, как подразумевается.

Поэтому я стараюсь следовать и строить только локально. Но когда я достигаю точки, где написано stack build --fast --pedantic, план сборки не может быть построен, и Stack предлагает добавить еще одну зависимость, stm-containers. При этом мне предлагаются два дополнительных предложения для focus и primitive. Когда я добавляю их, план снова терпит неудачу, на этот раз без простого решения:

In the dependencies for primitive-0.6.4.0:
    base-4.13.0.0 from stack configuration does not match >=4.5 && <4.13  (latest matching version is 4.12.0.0)
needed due to Spock-example-0.1.0.0 -> primitive-0.6.4.0

Я могу немного поработать с Haskell, но с системой (ями) сборки я ухожу моей зоны комфорта. Помощь и подсказки приветствуются. Да, и все версии, конечно, являются самыми последними на момент публикации.

1 Ответ

2 голосов
/ 11 апреля 2020

Из-за несовместимых версий зависимостей Spock не будет собираться с GH C 8.8 и выше. Подобная проблема описана в выпуске Спока # 149 , хотя я не совсем уверен, что это точно такая же несовместимость. На это намекает ошибка, полученная от Stack, поскольку base-4.13.0.0 - это версия base , которая связана с GH C 8.8. Сбой cabal-install более неясным способом, потому что, заметив несовместимость, он пытается решить зависимости, используя более старые версии Spock , в итоге выбирая 0.9.0.1, пытаясь и, благодаря верхней границе отсутствующей версии, для зависимости reroute , при которой ее не удалось построить.

(Вскоре после публикации этого ответа отсутствующая верхняя граница была модифицирована до старой версии Spock , поэтому попытка воспроизвести проблему сейчас приведет к более легкому пониманию ошибки.)

Если отбросить учебник, самый простой способ использовать Спока, учитывая эти сложности, возможно, через cabal-install 3+ , Начните с использования ghcup для переключения на GH C 8.6.5:

$ ghcup install 8.6.5
$ ghcup set 8.6.5

Затем создайте пустой проект с помощью cabal-install:

$ mkdir myproject
$ cd myproject
$ cabal init

Add Spock в build-depends раздел myproject.cabal:

  build-depends:       base >=4.12 && <4.13
                     , Spock == 0.13.*

Наконец, вы можете запустить:

$ cabal build

, который установит Spock и его зависимости перед построением проекта. (Обратите внимание, что вам обычно не нужно использовать cabal install для установки библиотек с помощью cabal-install 3.)

Предположительно возможно также заставить его работать со стеком, изменив на lts-14.27 resolver (последний, использующий GH C 8.6.5), отслеживающий все версии зависимостей, которые необходимо переопределить (как вы начали делать), и вручную добавив их в extra-deps из stack.yaml.

...