Использование rebar3 для управления проектами на Erlang

в 12:43, , рубрики: Elixir, Elixir/Phoenix, erlang, Erlang/OTP, hex, Packages, rebar, rebar3

Использование rebar3 для управления проектами на Erlang - 1

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  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: тут.
  • Статья достопочтенного А. Алексева: тут.

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

Автор: likid_ri

Источник

Поделиться

* - обязательные к заполнению поля