Yesod: знакомство

Приветствую!

Итак, Yesod… Я начинаю серию практичных заметок, посвящённых этому прекрасному инструменту. Сегодня мы узнаем, что это такое, зачем он нужен и как начать с ним работать.

Фундамент

Да, именно так слово “yesod” переводится с еврейского языка. Yesod - это мощный веб-фреймворк, написанный на языке Haskell. Прекрасный фундамент для наших веб-приложений.

На главной странице официального сайта приводятся основные, по мнению создателей, сильные стороны этого фреймворка:

  1. Ошибки времени выполнения становятся ошибками времени компиляции.
  2. Простая асинхронная работа.
  3. Расширяемость и эффективность.
  4. Легковесный синтаксис.

Я не стану расписывать в радужных красках эти преимущества. К тому же есть офицальная книга по Yesod. Цель этой заметки не в том, чтобы спеть славную оду в адрес Yesod и уговорить вас его попробовать, а в том, чтобы помочь тем, кто уже решил его попробовать. Впрочем, от себя скажу, что лично мне Yesod очень понравился.

Готовимся

Разумеется, нам нужны пакеты семейства yesod. Начнём:

$ cabal update
$ cabal install yesod-bin alex happy

Установка этого пакета потянет за собой ооооочень много других пакетиков, так что наберитесь терпения: их установка займёт на среднем современном ноутбуке минут 15.

После того, как всё готово, упростим себе жизнь: пропишем пути к новым утилитам в нашу PATH, дабы было удобнее. Откроем файл ~/.bashrc и добавим в него строку наподобие такой:

export PATH=$PATH:$HOME/.cabal/bin

Убедитесь, что команда yesod доступна в терминале.

Скелет

Теперь необходимо создать скелет нашего будущего веб-приложения. Для этого выполняем:

$ cd
$ yesod init

После этого вы увидите приглашение к краткой беседе:

Welcome to the Yesod scaffolder.
I'm going to be creating a skeleton Yesod project for you.

Затем вам следует ответить на два простых вопроса. Во-первых, указать имя проекта. Во-вторых, выбрать СУБД. Yesod поддерживает классическую четвёрку: SQLite, PostgreSQL, MySQL и MongoDB. Можно, конечно, и без СУБД (ну, для совсем helloworld-ных случаев), но мы с вами знаем, что без БД в реальном веб-приложении чрезвычайно скучно. Я выбрал Postgres. Далее подразумевается, что вы имеете (хотя бы минимальный) навык работы с psql.

Кстати! Haskell-овский пакет, взаимодействующий с Postgres, завязан на стандартную C-шную библиотеку libpq. Если вы решили использовать Postgres и у вас ещё нет этой библиотеки, обязательно установите её из своего репозитория.

После этого вы увидите вот такую забавную картинку:

                     ___
                            {-)   |\
                       [m,].-"-.   /
      [][__][__]         \(/\__/\)/
      [__][__][__][__]~~~~  |  |
      [][__][__][__][__][] /   |
      [__][__][__][__][__]| /| |
      [][__][__][__][__][]| || |  ~~~~
  ejm [__][__][__][__][__]__,__,  \__/

а это значит, что дело сделано. У нас появился каталог по имени нашего проекта, пусть это будет webhs. Внутри этого каталога расположился наш проект. Причём он далеко не такой уж и helloworld-ный, каким может показаться…

Стартуем

Вперёд:

$ cd webhs
$ cabal install

В результате этой команды наш проект будет собран, и мы готовы впервые лицезреть его. Для этого запускаем:

$ yesod devel -p 3001

Запустится отладочный сервер, и приложение будет доступно на порту 3001. Если же не указывать порт, по умолчанию используется 3000.

Впрочем, я обманул вас. На данный момент запустить приложение нам не удастся. Причина проста: мы же выбрали работу с Postgres, однако никак к этому не подготовились. Потому мы и увидим в терминале нечто подобное:

Devel application launched: http://localhost:3001
devel.hs: libpq: failed (FATAL:  role "webhs" does not exist

Дабы исправить эту досадную оплошность, открываем файл config/postgresql.yml и вносим в него нужные параметры. Я не буду описывать их, потому что там всё предельно просто: указываем имя БД, пользователя и пароль (в качестве последних двух по умолчанию используется имя нашего проекта). Естественно, далее я исхожу из того, что соответствующую БД вы уже создали и предоставили права на неё соответствующему пользователю.

Теперь мы готовы. Запускаем:

$ yesod devel -p 3001

заглядываем в http://localhost:3001 и любуемся. Конечно, любоваться особенно нечем, но начало положено.

Пояснение по приложению

Вы спросите, а что же такое мы запустили? Чем является наше приложение с технической точки зрения?

Всё предельно просто. В каталоге нашего проекта, после его сборки, появился следующий файл: ~/webhs/dist/build/webhs/webhs. Это и есть исполняемый файл нашего приложения. Команда yesod devel -p 3001 просто запустила его в отладочном режиме (что очень удобно на стадии знакомства с системой), однако мы можем запустить этот файл и напрямую:

$ ./dist/build/webhs/webhs
Usage: webhs <environment> [--port <port>]
Valid environments: [Development,Testing,Staging,Production]

Здесь следует указать среду Development и, если нужно, порт. И всё запустится точно так же.

Но вы спросите меня, а как же веб-сервер? Ведь запросы на http://localhost:3001 должен кто-то принимать, не так ли? Совершенно верно, но для первого знакомства нам не понадобится ни наш любимый nginx, ни его братья. Наше приложение уже содержит в себе свой собственный веб-сервер. Называется он warp. Его можно использовать и как отдельный, легковесный http-сервер, но в Yesod-приложении он уже и так есть. Разумеется, если вы хотите, чтобы поверх него работал, например, nginx, вы можете сделать простое перенаправление на localhost:3001. Именно так я сделал на моём продакшн-сервере.

Ну что ж, для первой заметки достаточно. В следующей заметке мы поговорим о структуре нашего проекта.