Yesod: знакомство
Приветствую!
Итак, Yesod… Я начинаю серию практичных заметок, посвящённых этому прекрасному инструменту. Сегодня мы узнаем, что это такое, зачем он нужен и как начать с ним работать.
Фундамент
Да, именно так слово “yesod” переводится с еврейского языка. Yesod - это мощный веб-фреймворк, написанный на языке Haskell. Прекрасный фундамент для наших веб-приложений.
На главной странице официального сайта приводятся основные, по мнению создателей, сильные стороны этого фреймворка:
- Ошибки времени выполнения становятся ошибками времени компиляции.
- Простая асинхронная работа.
- Расширяемость и эффективность.
- Легковесный синтаксис.
Я не стану расписывать в радужных красках эти преимущества. К тому же есть офицальная книга по 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
. Именно так я сделал на моём продакшн-сервере.
Ну что ж, для первой заметки достаточно. В следующей заметке мы поговорим о структуре нашего проекта.