stack и Yesod: дружба навек

Приветствую, друзья!

Бодро сообщив всему миру о том, что отныне (и вовек?) я использую Stack, приступил я к переводу моих проектов на этот самый Stack.

Начиналось всё прекрасно: я снёс Haskell Platform во избежание путаницы между “системным” ghc и установленным(и) с помощью stack setup. Но затем я столкнулся с одной небольшой проблемкой, решением которой хочу поделиться с вами. Думаю, кому-то пригодится.

Yesod старый

Один из моих Haskell-проектов базируется на Yesod. И очень уж я привык к команде вида:

которая запускает проект на локальном сервере, да ещё и автоматически пересобирает его при изменениях в коде. Вот тут-то и ждала меня трудность.

Дело в том, что команда yesod devel вызывает утилиту yesod, устанавливаемую с пакетом yesod-bin. И вот запускаю я её в моём проекте - и получаю ерунду:

Стоп, а почему cabal? А потому: работать эта утилита умеет исключительно с cabal и знать ничего не знает про stack.

Yesod новый

Как вы понимаете, о вышеупомянутой проблеме прекрасно знал великий наш Снойман, а посему 29 июня он опубликовал статью stack support for yesod devel. В ней предложено решение: установить пакет yesod-bin версии 1.4.11 (от того же 29 июня), поддерживающий stack, после чего запускать сие через stack exec.

Сказано - сделано. Утилита yesod-bin у меня уже имелась, причём той самой версии 1.4.11 (из stack-снимка 2.18). Запускаю в проекте:

и получаю ошибку:

Так, с наскока не вышло. Я ведь проект-то перевёл уже на ghc 7.10.2, а yesod-bin был собран ещё старой версией 7.8.4. Переустанавливаю:

Как вы поняли, версия 1.4.13.3 взята из lts-снимка 3.1, который я начал использовать после перехода на ghc 7.10.2. Установка прошла без проблем.

Новая трудность

Итак, продолжим:

Да-да, запускать необходимо именно так, через два минуса. В статье Снойман об этом не упомянул, но я нашёл это в этом коммите.

Ура, наконец-то начинается пересборка проекта - и вдруг:

Не совсем понятно, о чём речь, но гугление подсказало, что дело в версии cabal. Вот что сказал об этом один из хаскелистов:

That error only happens with versions prior to Cabal/cabal-install-1.22 (and GHC 7.10 requires version 1.22 or later),

Что ж, всё понятно, обновляем cabal. Для этого в файле ~/.stack/global/stack.yaml меняем resolver с 2.18 на 3.1, после чего:

После установки проверяем:

То что надо. Вернувшись в каталог проекта, выполняем:

Победа! Кстати, обратите внимание на маленькое изменение: раньше для остановки сервера нужно было просто нажать Enter, теперь же необходимо напечатать quit.

Итак, теперь stack и yesod прекрасно уживаются друг с другом.