Использование rebar3 для управления проектами на Erlang
Rebar3 — это инструмент для языка программирования Erlang, который позволяет легко и удобно управлять проектами, написанными на Erlang (иногда и на Elixir).
Люди уже давно знакомые с Erlang знают старый rebar и, возможно даже, до сих пор его используют. Многим (особенно тем, кто пришел из других языков с гораздо более развитой экосистемой) rebar не нравился и время от времени его там и тут называют «позорной подделкой», которую можно было бы заменить скриптом на Perl. К счастью много работать с rebar мне не приходилось (в отличие от автора, выше приведенных слов), но с базовыми вещами rebar справлялся довольно таки неплохо. Но «неплохо» — это не «хорошо». Несогласных с таким положением дел (с «неплохо») оказалось не мало и потому решили они дать арматуре вторую жизнь в виде проекта rebar3
, который нынче активно развивается. Над проектом среди прочих работает небезызваестный сир Фред Хеберт, которого знают те, кто читал книгу «Изучай Erlang во имя добра!».
Своей задачей в этой статья я ставлю привлечение внимания к rebar3
. Уже знакомые с rebar/rebar3 в статье найдут не много нового, но новичкам в мире Erlang может быть интересно. Мы будем говорить о том, как стартовать с rebar3
(установка, компиляция и т.п).
Уставнока rebar3
По части установки у нас есть две пути:
- Cкачать уже скопилированный файл
rebar3
. - Cобрать все самому из исходного кода.
Чтобы никого не обдиеть я покажу оба способа, а какой лучше — решать вам.
Способ первый:
➜ ~ wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3
Способ второй:
➜ ~ git clone https://github.com/erlang/rebar3.git
➜ cd rebar3
➜ ./bootstrap
Теперь необходимо добавить путь к файлу в переменную окружения $PATH
.
Делается это следующим образом:
➜ ./rebar3 local install
===> Extracting rebar3 libs to ~/.cache/rebar3/lib...
===> Writing rebar3 run script ~/.cache/rebar3/bin/rebar3...
===> Add to $PATH for use: export PATH=$PATH:~/.cache/rebar3/bin
После этого выполните команду, которую вас просят ввести либо добавьте эту строку в ваш *rc
файл (~/.zshrc
, ~/.bashrc
).
Например так:
➜ ~ echo "export PATH=$PATH:~/.cache/rebar3/bin" >> ~/.zshrc
Первое приложение
Rebar3 (как и большинство уважающих себя инструментов управления пакетами) позволяет создавать макет приложения из уже
готовых шаблонов. Отмечу, что rebar3 создает структуру только для OTP приложения. Ниже приведен список доступных шаблонов, переводить описание которых я не вижу смысла.
app: Complete OTP Application structure.
cmake: Standalone Makefile for building C/C++ in c_src
escript: Complete escriptized application structure
plugin: Rebar3 plugin project structure
release: OTP Release structure for executable programs
lib: Complete OTP Library application (no processes) structure
Нас интересует только app
и создавать свое приложение мы будем на основе этого шаблона:
➜ ~ rebar3 new app habrapp
===> Writing habrapp/src/habrapp_app.erl
===> Writing habrapp/src/habrapp_sup.erl
===> Writing habrapp/src/habrapp.app.src
===> Writing habrapp/rebar.config
===> Writing habrapp/.gitignore
===> Writing habrapp/LICENSE
===> Writing habrapp/README.md
➜ ~
Шаблон создан. Теперь давайте посмотрим на структуру проекта:
➜ ~ cd habrapp
➜ ~/habrapp t # у меня установлен alias, вы используйте tree
.
├── LICENSE
├── README.md
├── rebar.config
└── src
├── habrapp_app.erl
├── habrapp.app.src
└── habrapp_sup.erl
Обычная структурая приложения Erlang. Что хотелось бы сказать, забегая вперед, так это то, что rebar.config
используется для хранения метаданных о приложении (в том числе и данных о зависимостях)
Если вы любитель интерактивности, то и тут rebar3 вас не подведет. Вы сможете с легкостью перейти в shell-mode:
➜ ~/habrapp rebar3 shell
===> Fetching rebar3_hex ({pkg,<<"rebar3_hex">>,<<"3.0.0">>})
===> Downloaded package, caching at /home/lk/.cache/rebar3/hex/default/packages/rebar3_hex-3.0.0.tar
===> Compiling rebar3_hex
===> Verifying dependencies...
===> Compiling habrapp
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false]
Eshell V7.3 (abort with ^G)
1> application:start(habrapp).
ok
2> application:stop(habrapp).
=INFO REPORT==== 19-Jan-2017::14:03:38 ===
application: habrapp
exited: stopped
type: temporary
ok
Кстати говоря, теме shell посвящена целая статья на сайте у Фреда Хеберта.
Установка и удаление пакетов
Первое, что нам необходимо сделать, так это установить плагин для rebar3
, который называется rebar3_hex. Для этого нам нужно отредактировать файл rebar.config
и добавить в кортеж рядом с тегом plugin
название нужного нам плагина в виде атома: {plugins, [rebar3_hex]}.
После этого делаем следующее:
➜ ~/habrapp rebar3 update
===> Fetching rebar3_hex ({pkg,<<"rebar3_hex">>,<<"3.1.0">>})
===> Downloaded package, caching at /home/lk/.cache/rebar3/hex/default/packages/rebar3_hex-3.1.0.tar
===> Compiling rebar3_hex
===> Updating package registry...
===> Writing registry to /home/lk/.cache/rebar3/hex/default/registry
===> Generating package index...
===> Writing index to /home/lk/.cache/rebar3/hex/default/packages.idx
Здесь rebar3 берет информацию из нашего файла rebar.config
. И если вы не хотите постоянно добавлять {plugins, [rebar3_hex]}.
в ваши rebar.config
файлы, то добавьте его в глобальный файл rebar3, который расположен по адресу ~/.config/rebar3/rebar.config
и rebar3 будет автоматически брать все из глобального файла конфигурации.
Если ваш проект работает на основе какого-то другого проекта, то вы сможете получить его (при условии, что он есть в hex.pm).
Поиск проектов осуществляется очень просто:
➜ ~/habrapp rebar3 hex search smokkfiskur
smokkfiskur: 0.1.1, 0.1.2, 0.1.3
После того, как мы убедились, что проект, который мы ищем существует мы можем его получить. Для этого нам необходимо отредактировать файл rebar.config
(не глобальный) и рядом с меткой deps
указать название нужного пакета (да, в виде атома).
{deps, [smokkfiskur, mochiweb]}.
При желании можно добавить немного конкретики:
{deps, [{smokkfiskur, "0.1.3”}, {mochiweb, "2.15.0"}]}.
Представим, что в нашем проекте мы используем smokkfiskur
и mochiweb
. Все, что нам нужно, чтобы получить зависимости — это выполнить rebar3 compile
:
➜ ~/habrapp rebar3 compile
===> Verifying dependencies...
===> Fetching mochiweb ({pkg,<<"mochiweb">>,<<"2.15.0">>})
===> Downloaded package, caching at /home/lk/.cache/rebar3/hex/default/packages/mochiweb-2.15.0.tar
===> Fetching smokkfiskur ({pkg,<<"smokkfiskur">>,<<"0.1.3">>})
===> Downloaded package, caching at /home/lk/.cache/rebar3/hex/default/packages/smokkfiskur-0.1.3.tar
===> Compiling mochiweb
===> Compiling smokkfiskur
===> Compiling habrapp
Посмотреть зависимости проще, чем набрать pip freeze
(ну почти, ± 1 символ):
➜ ~/habrapp rebar3 deps
mochiweb* (package)
smokkfiskur* (package)
Удалить пакеты так же не составит труда. Вам нужно просто убрать название проекта из списка {deps, [smokkfiskur]}
и набрать команды, что приведены ниже:
➜ ~/habrapp rebar3 unlock
➜ ~/habrapp rebar3 deps
smokkfiskur* (package)
Удалить все скомпилированные *.beam
файлы из проекта можно командой clean
.
➜ rebar3 clean
Работа с документацией
Документация немаловажная часть любого проекта и удобная работа с ней очень важна. Что может быть удобнее простой команды rebar3 edoc
, которая генерирует документацию?
➜ ~/habrapp rebar3 edoc
===> Linking _build/default/plugins/rebar3_hex to _build/docs/plugins/rebar3_hex
===> Verifying dependencies...
===> Linking _build/default/lib/smokkfiskur to _build/docs/lib/smokkfiskur
===> Compiling habrapp
===> Running edoc for habrapp
Тестирование
Rebar3 позволяет запускать как Eunit тесты, так и Common Tests. Тесты для нашего приложения мы не написали, одна как их запускать мы все же посмотрим.
➜ ~/habrapp rebar3 ct
➜ ~/habrapp rebar3 eunti
Посмотреть покрытие кода тестами можно так:
➜ rebar3 cover
Дистрибьюция
Распостранение пакетов является немаловажным и с этим нам поможет плагин rebar3_hex
, с которым мы уже имели дело. Нам нужно иметь аккаунт на hex.pm, чтобы опубликовать там пакет. Зарегестрировать его очень можно прямо в консоли.
➜ ~/habrapp rebar3 hex user register
By registering an account on Hex.pm you accept all our policies and terms of service found at https://hex.pm/policies
Username: ([])>
После того, как с регистрацией все покончено, вы сможете опубликовать свой проект на hex.pm командой publish
.
➜ ~/habrapp rebar3 hex publish
===> Verifying dependencies...
Publishing habrapp 0.1.0
Description: An OTP application
Dependencies:
smokkfiskur 0.1.3
Included files:
/home/lk/habrapp/LICENSE
/home/lk/habrapp/README.md
/home/lk/habrapp/rebar.config
/home/lk/habrapp/rebar.lock
/home/lk/habrapp/src/habrapp.app.src
/home/lk/habrapp/src/habrapp_app.erl
/home/lk/habrapp/src/habrapp_sup.erl
Maintainers:
Licenses:
Links:
Build tools: rebar3
Before publishing, please read Hex CoC: https://hex.pm/policies/codeofconduct
Proceed? ("Y")> n
Goodbye...
Вам нужно ввести Y
, если вы публикует что-то более осмысленное, чем шаблон. Мы с вами не будем публиковать наше никчемное приложение и портить девственную чистоту этого хранилища пакетов.
Плюшка
Для счастливчиков работающих в среде *nix
дополнительно имеется приятна плюшка в виде автоматического дополнения вводимых команд для zsh
. Найти плагин вы сможете тут.
Ссылки
- Hex.pm: тут.
- Статья Фреда Херберта: тут.
- Сайт
rebar3
и документация: тут. - Репозиторий
rebar3
: тут. - Статья достопочтенного А. Алексева: тут.
Вот собственно и все, что я хотел рассказать. Спасибо за внимание!