Rebar3 — это инструмент для языка программирования Erlang, который позволяет легко и удобно управлять проектами, написанными на Erlang (иногда и на Elixir).


Люди уже давно знакомые с Erlang знают старый rebar и, возможно даже, до сих пор его используют. Многим (особенно тем, кто пришел из других языков с гораздо более развитой экосистемой) rebar не нравится и время от времени его там и тут называют "позорной подделкой", которую можно было бы заменить скриптом на Perl. К счастью много работать с rebar мне не приходилось (в отличие от автора выше приведенных слов), но с базовыми вещами rebar справлялся довольно-таки неплохо. Но "неплохо" — это не "хорошо". Несогласных с таким положением дел (с "неплохо") оказалось немало и потому решили они дать арматуре вторую жизнь в виде проекта rebar3, который нынче активно развивается. Над проектом среди прочих работает небезызваестный сир Фред Хеберт, который подарил миру книгу "Изучай Erlang во имя добра!".


Своей задачей в этой статья я ставлю привлечение внимания к rebar3. Уже знакомые с rebar/rebar3 в статье найдут не много нового, но новичкам в мире Erlang может быть интересно. Мы будем говорить о том, как стартовать с rebar3 (установка, компиляция и т.п).


Уставнока rebar3


По части установки у нас есть две пути:


  1. Cкачать уже скопилированный файл rebar3.
  2. 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: тут.
  • Статья достопочтенного А. Алексева: тут.

Вот собственно и все, что я хотел рассказать. Спасибо за внимание!

Интересен ли вам rebar3?

Проголосовало 39 человек. Воздержалось 15 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (7)


  1. andrAnat
    19.01.2017 17:48

    Если мне не изменяет память, то rebar/rebar3 сейчас редко используется в отрыве от erlang.mk!? Который является на данный момент едва-ли не «золотым стандартом» при сборке проекта/релиза.


    1. likid_ri
      19.01.2017 17:49

      Об erlang.mk я слышал, но так-то плотно работать с ним не приходилось, потому спасибо, что напомнили.


    1. redbeardster
      19.01.2017 18:37

      rebar работает вполне «автономно»


    1. egobrain
      20.01.2017 00:59

      Вы явно что-то путаете. Используется или rebar/rebar3 или erlang.mk
      Они заменят, а не дополняют друг друга.
      Erlang.mk появился из-за убогости и тормознутости rebar, но rebar3 поборол все (или почти все) детские болезни.
      По своему опыту скажу, что работать с rebar3 очень удобно. Мы перевели почти все проекты на него и избавились от тонны проблем.
      Отдельная вещь, которую автор упустил, но стоило бы рассказать — это rebar.lock файл, который принудительно фиксирует версии зависимостей в проекте и гарантирует что при сборке на другой машине они будут абсолютной такими же.


      1. likid_ri
        20.01.2017 08:59

        Я совершенно забыл о rebar.lock. Обновлю статью в ближайшее время, а вам спасибо, что напомнили.


  1. Sirikid
    22.01.2017 04:49
    +1

    Слышал что некоторые использую Mix потому что он удобнее, но, это было уже довольно давно и я совсем не эрлангист. Rebar3 лучше Mix, хуже или выбор тут дело вкуса?


    1. likid_ri
      22.01.2017 11:44

      Я думаю, что такое сравнение вообще уместно. Mix создан для Elixir и я никогда не слышал, чтобы его использовали для управления проектами на Erlang. Если же вы сравниваете функционал, то, разумеется, Mix богаче и гибче.

      UPD: Загуглил и сразу жен нашел информацию тут. Но я не уверен хорошая это идея или же плохая.