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 tree
.
+-- LICENSE
+-- README.md
+-- rebar.config
L-- src
+-- habrapp_app.erl
+-- habrapp.app.src
L-- 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
: тут. - Статья достопочтенного А. Алексева: тут.
Вот собственно и все, что я хотел рассказать. Спасибо за внимание!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (7)
Sirikid
22.01.2017 04:49+1Слышал что некоторые использую Mix потому что он удобнее, но, это было уже довольно давно и я совсем не эрлангист. Rebar3 лучше Mix, хуже или выбор тут дело вкуса?
likid_ri
22.01.2017 11:44Я думаю, что такое сравнение вообще уместно. Mix создан для Elixir и я никогда не слышал, чтобы его использовали для управления проектами на Erlang. Если же вы сравниваете функционал, то, разумеется, Mix богаче и гибче.
UPD: Загуглил и сразу жен нашел информацию тут. Но я не уверен хорошая это идея или же плохая.
andrAnat
Если мне не изменяет память, то rebar/rebar3 сейчас редко используется в отрыве от erlang.mk!? Который является на данный момент едва-ли не «золотым стандартом» при сборке проекта/релиза.
likid_ri
Об erlang.mk я слышал, но так-то плотно работать с ним не приходилось, потому спасибо, что напомнили.
redbeardster
rebar работает вполне «автономно»
egobrain
Вы явно что-то путаете. Используется или rebar/rebar3 или erlang.mk
Они заменят, а не дополняют друг друга.
Erlang.mk появился из-за убогости и тормознутости rebar, но rebar3 поборол все (или почти все) детские болезни.
По своему опыту скажу, что работать с rebar3 очень удобно. Мы перевели почти все проекты на него и избавились от тонны проблем.
Отдельная вещь, которую автор упустил, но стоило бы рассказать — это rebar.lock файл, который принудительно фиксирует версии зависимостей в проекте и гарантирует что при сборке на другой машине они будут абсолютной такими же.
likid_ri
Я совершенно забыл о rebar.lock. Обновлю статью в ближайшее время, а вам спасибо, что напомнили.