77
Юра Жлоба для Erlang Dnipro 2014 Все, что вы хотели знать о Rebar, но ленились прочитать :)

Все, что вы хотели знать о Rebar, но ленились прочитать

Embed Size (px)

Citation preview

Page 1: Все, что вы хотели знать о Rebar, но ленились прочитать

Юра Жлоба для Erlang Dnipro 2014

Все, что вы хотели знать о Rebar, но ленились прочитать :)

Page 2: Все, что вы хотели знать о Rebar, но ленились прочитать

Rebar – это арматура для железобетонных конструкций

http://en.wikipedia.org/wiki/Rebar

Page 3: Все, что вы хотели знать о Rebar, но ленились прочитать

Известный инструмент для сборки Erlang-проектов

https://github.com/rebar/rebar/

Page 4: Все, что вы хотели знать о Rebar, но ленились прочитать

Rebar умеет

Собирать Erlang-сорцы

Собирать С/C++ сорцы (драйвера)

Собирать ErlyDTL шаблоны

Собирать Protocol Buffers определения

Page 5: Все, что вы хотели знать о Rebar, но ленились прочитать

Rebar умеет

Создавать модули из шаблонов

Создавать релизы

Управлять зависимостями

Запускать тесты (EUnit и Common Test)

Генерировать документацию

Page 6: Все, что вы хотели знать о Rebar, но ленились прочитать

Rebar это

Один исполняемый файлик

cкачал, положил в проект

или в PATH

и запускай :)

Page 7: Все, что вы хотели знать о Rebar, но ленились прочитать

Rebar это

Популярный проект на github

https://github.com/rebar/rebar/

117 контрибуторов

100 форков

12600 строк кода

Page 8: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Wiki-документация в проекте на github

https://github.com/rebar/rebar/wiki

Page 9: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Встроенная документация

rebar help

rebar --commands

rebar help compilerebar help get-depsrebar help eunit

Page 10: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Доклад Dizzy Smith

Erlang разработчика из Basho

на Erlang User Conference 2012

Applied Rebar

Page 11: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Смотреть в исходный код.

Некоторые вещи можно узнать только оттуда.

Например, опции сборкиErlyDTL шаблонов

Page 12: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Все эти источники не полны

Нельзя просто взять, и прочитатьвсе про Rebar в одном месте по порядку

Page 13: Все, что вы хотели знать о Rebar, но ленились прочитать

Как его освоить?

Мой доклад исправляет этот недостаток :)

Page 14: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

Начать очень просто

Нам хватит 4-х команд

Page 15: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

Вытягиваем зависимости

rebar get-deps

Page 16: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

Собираем проект

rebar compile

Page 17: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

Запускаем тесты

rebar eunit

Page 18: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

Очищаем проект

rebar clean

Page 19: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

И одна опция

skip_deps=true

Page 20: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

rebar get-deps

rebar compile

rebar compile skip_deps=true

rebar eunit skip_deps=true

rebar clean skip_deps=true

Page 21: Все, что вы хотели знать о Rebar, но ленились прочитать

Основные команды

4 команды и одна опцияи вы знатоки Rebar :)

rebar get-depsrebar compile rebar compile skip_deps=truerebar eunit skip_deps=truerebar clean skip_deps=true

Page 22: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

соблюдаем

OTP Design Principles

Page 23: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

OTP Design Principles

ebin, include, src, priv

Page 24: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

ebin, include, src, priv

c_src, deps, test

Page 25: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

Erlc

http://www.erlang.org/doc/man/erlc.html

Page 26: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

erlc -I include -o ebin src/*.erl

Page 27: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

-I include

-o ebin

-DNAME=value

-Werror

src/*erl

Page 28: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

ebin/myapp.app

{application,metalkia, [{description,"web blog platform"}, {vsn,"1"}, {registered,[]}, {applications,[kernel,stdlib]}, {mod,{metalkia_app,[]}}, {env,[]}, {modules, [main_handler,metalkia_app,metalkia_sup]}]}.

Page 29: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

src/myapp.app.src

{application,metalkia, [{description,"web blog platform"}, {vsn,"1"}, {registered,[]}, {applications,[kernel,stdlib]}, {mod,{metalkia_app,[]}}, {env,[]}, {modules, []}]}.

Page 30: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

C/C++

c_src

Page 31: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

ErlyDTL

templates/*.dtl ebin/*_dtl.beam→

Page 32: Все, что вы хотели знать о Rebar, но ленились прочитать

Сборка

Google Protocol Buffers

src/*.proto →ebin/*_pb.beam, include/*_pb.hrl

Page 33: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

{deps, [Dependency1, Dependency2, Dependency3]}.

Page 34: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Dependency:

{App, VsnRegex, Source}

Page 35: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Source:

{git, Url, Rev}{hg, Url, Rev}{bzr, Url, Rev}

Page 36: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Revision:

{branch, "master"}

{tag, "v1.0"}

"62b7c9b12daacfcbcf274bc0925a7f8d10e3a1e0"

"v1.0"

"HEAD"

""

Page 37: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

{deps, [ {emysql, ".*", {git, "https://github.com/Eonblast/Emysql.git", "62b7c9b12daacfcbcf274bc0925a7f8d10e3a1e0"}}, {mcd, ".*", {git, "https://github.com/EchoTeam/mcd.git", "f72ebf5006e1b1234e16f86514e4291c57506024"}}, {cowboy, ".*", {git, "https://github.com/extend/cowboy", "0.8.6"}}, {mimetypes, ".*", {git, "git://github.com/spawngrid/mimetypes.git", {branch, "master"}}}, {lager, ".*", {git, "https://github.com/basho/lager.git", "2.0.1"}}, {ux, ".*", {git, "https://github.com/erlang-unicode/ux.git", "v3.4.1"}} ]}.

Page 38: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Зависимость от tag или commitХорошо

Зависимость от “HEAD”, {branch, “master”}не очень хорошо :(

Page 39: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Все зависимости сами должны бытьRebar проектами

транзитивные тоже

Page 40: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

Не rebar зависимость должна быть помечена [raw]

{somelib, ".*", {git, "https://somewhere.com/somelib.git", "v1.0"},

[raw]}

Page 41: Все, что вы хотели знать о Rebar, но ленились прочитать

Управление зависимостями

rebar check-deps

rebar list-deps

rebar update-deps

rebar delete-deps

Page 42: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create template= [var=foo,...]

Page 43: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create template=simpleapp appid=myapp

rebar create template=simplesrv srvid=my_server

Page 44: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create-app appid=myapp

rebar create-node nodeid=mynode

Page 45: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar list-templates

Page 46: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar list-templates==> tmp (list-templates) * simplesrv: priv/templates/simplesrv.template (escript) (variables: "srvid") * simplenode: priv/templates/simplenode.template (escript) (variables: "nodeid") * simplemod: priv/templates/simplemod.template (escript) (variables: "modid") * simplefsm: priv/templates/simplefsm.template (escript) (variables: "fsmid") * simpleapp: priv/templates/simpleapp.template (escript) (variables: "appid") * ctsuite: priv/templates/ctsuite.template (escript) (variables: "testmod") * basicnif: priv/templates/basicnif.template (escript) (variables: "module")

Page 47: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create template=simpleapp appid=coolstuff ==> coolstuff (create) Writing src/coolstuff.app.src Writing src/coolstuff_app.erl Writing src/coolstuff_sup.erl yura ~/p/coolstuff $ tree . └── src ├── coolstuff_app.erl ├── coolstuff.app.src └── coolstuff_sup.erl

1 directory, 3 files

Page 48: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create template=simplesrv srvid=my_server ==> coolstuff (create) Writing src/my_server.erl yura ~/p/coolstuff $ cat src/my_server.erl -module(my_server). -behaviour(gen_server). -define(SERVER, ?MODULE). ...

Page 49: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

rebar create template=simplemod modid=my_cool_module ==> coolstuff (create) Writing src/my_cool_module.erl Writing test/my_cool_module_tests.erl yura ~/p/coolstuff $ cat src/my_cool_module.erl -module(my_cool_module).

-export([my_func/0]).

my_func() -> ok. yura ~/p/coolstuff $ cat test/my_cool_module_tests.erl -module(my_cool_module_tests). -include_lib("eunit/include/eunit.hrl").

Page 50: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

yura ~/p/rebar/priv/templates $ ls -1 *.template

basicnif.template

ctsuite.template

simpleapp.template

simplefsm.template

simplemod.template

simplenode.template

simplesrv.template

Page 51: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

yura ~/p/rebar/priv/templates $ ls -1 simpleapp* simpleapp_app.erl simpleapp.app.src simpleapp_sup.erl simpleapp.template

yura ~/p/rebar/priv/templates $ cat simpleapp.template {variables, [{appid, "myapp"}]}. {template, "simpleapp.app.src", "src/{{appid}}.app.src"}. {template, "simpleapp_app.erl", "src/{{appid}}_app.erl"}. {template, "simpleapp_sup.erl", "src/{{appid}}_sup.erl"}.

Page 52: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

simpleapp -- создает приложение

simplesrv -- создает gen_server модуль

simplemod -- создает пустой модуль

Page 53: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

simplefsm -- создает gen_fsm модуль

basicnif -- создает порт, erlang-модуль и с-файл

ctsuite -- создает common test suite модуль

simplenode -- создает файлы для релиза

Page 54: Все, что вы хотели знать о Rebar, но ленились прочитать

Шаблоны

~/.rebar/templates

либо клонировать rebar

Page 55: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar eunit

Page 56: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar eunit skip_deps=true

Page 57: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar eunit skip_deps=truesuites=module1_test

Page 58: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar eunit skip_deps=truesuites=”module1_test,module2_test”

Page 59: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar eunit skip_deps=truesuites=module1_testtests=some_test_fun

Page 60: Все, что вы хотели знать о Rebar, но ленились прочитать

Тестирование

rebar ct \[suites=\] \[case=\]

Page 62: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

http://www.erlang.org/doc/man/compile.html

{erl_opts, [debug_info, warn_export_all, warn_missing_spec, warning_as_errors, {d, MY_MACRO, Value}, {parse_transform, lager_transform} ]}.

Page 63: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

src_dir

deps_dir

target_dir

{erl_opts, [{i, "my_include"}]}

Page 64: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

Вложенные OTP-приложения

{lib_dirs, ["deps", "apps"]}.

{sub_dirs, ["apps/app1", "apps/app2"]}.

Page 65: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

{cover_enabled, true}.

{clean_files, ["erl_crash.dump"]}.

Page 66: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

Настройки документированы слабо

В чужих конфигах встречаются нигде не описанные опции

Большинство настроек не нужно

Page 67: Все, что вы хотели знать о Rebar, но ленились прочитать

rebar.config

Нужно:

{deps, []}.

warning_as_error

{parse_transform, lager_transform}

и все :)

Page 68: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Создание и запуск

консольных приложений

на Erlang

Page 69: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Я делаю такие приложения

на Bash или Python,

но ...

Page 70: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Rebar сам является

escript приложением

Page 71: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

#!/usr/bin/env escript

%%! -pa rebar/rebar/ebin

полезная нагрузка

Page 72: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Исходный код Erlang

Скомпилированный beam-файл

Zip-архив с beam-файлами

Page 73: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Rebar представляет собой Zip-архив

и его можно распаковать :)

только сперва нужно переименовать

Page 74: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

mv rebar rebar_file

unzip rebar_file

Page 75: Все, что вы хотели знать о Rebar, но ленились прочитать

Escipt

Archive: rebar_file warning [rebar_file]: 51 extra bytes at beginning or within zipfile (attempting to process anyway) creating: rebar/ creating: rebar/ebin/ inflating: rebar/ebin/getopt.beam inflating: rebar/ebin/mustache.beam inflating: rebar/ebin/rebar.app inflating: rebar/ebin/rebar.beam ... creating: priv/ creating: priv/templates/ inflating: priv/templates/basicnif.c inflating: priv/templates/basicnif.erl inflating: priv/templates/basicnif.template ...

Page 76: Все, что вы хотели знать о Rebar, но ленились прочитать

Прочее

rebar xref

rebar qc

rebar doc

Сборка релизов

Page 77: Все, что вы хотели знать о Rebar, но ленились прочитать

Вопросы?