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

1,696 views
1,385 views

Published on

1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
1,696
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
15
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Все, что вы хотели знать о Rebar, но ленились прочитать :) Юра Жлоба для Erlang Dnipro 2014
  2. 2. Rebar – это арматура для железобетонных конструкций http://en.wikipedia.org/wiki/Rebar
  3. 3. Известный инструмент для сборки Erlang-проектов https://github.com/rebar/rebar/
  4. 4. Rebar умеет Собирать Erlang-сорцы Собирать С/C++ сорцы (драйвера) Собирать ErlyDTL шаблоны Собирать Protocol Buffers определения
  5. 5. Rebar умеет Создавать модули из шаблонов Создавать релизы Управлять зависимостями Запускать тесты (EUnit и Common Test) Генерировать документацию
  6. 6. Rebar это Один исполняемый файлик cкачал, положил в проект или в PATH и запускай :)
  7. 7. Rebar это Популярный проект на github https://github.com/rebar/rebar/ 117 контрибуторов 100 форков 12600 строк кода
  8. 8. Как его освоить? Wiki-документация в проекте на github https://github.com/rebar/rebar/wiki
  9. 9. Как его освоить? Встроенная документация rebar help rebar --commands rebar help compile rebar help get-deps rebar help eunit
  10. 10. Как его освоить? Доклад Dizzy Smith Erlang разработчика из Basho на Erlang User Conference 2012 Applied Rebar
  11. 11. Как его освоить? Смотреть в исходный код. Некоторые вещи можно узнать только оттуда. Например, опции сборкиErlyDTL шаблонов
  12. 12. Как его освоить? Все эти источники не полны Нельзя просто взять, и прочитать все про Rebar в одном месте по порядку
  13. 13. Как его освоить? Мой доклад исправляет этот недостаток :)
  14. 14. Основные команды Начать очень просто Нам хватит 4-х команд
  15. 15. Основные команды Вытягиваем зависимости rebar get-deps
  16. 16. Основные команды Собираем проект rebar compile
  17. 17. Основные команды Запускаем тесты rebar eunit
  18. 18. Основные команды Очищаем проект rebar clean
  19. 19. Основные команды И одна опция skip_deps=true
  20. 20. Основные команды rebar get-deps rebar compile rebar compile skip_deps=true rebar eunit skip_deps=true rebar clean skip_deps=true
  21. 21. Основные команды 4 команды и одна опция и вы знатоки Rebar :) rebar rebar rebar rebar rebar get-deps compile compile skip_deps=true eunit skip_deps=true clean skip_deps=true
  22. 22. Сборка соблюдаем OTP Design Principles
  23. 23. Сборка OTP Design Principles ebin, include, src, priv
  24. 24. Сборка ebin, include, src, priv c_src, deps, test
  25. 25. Сборка Erlc http://www.erlang.org/doc/man/erlc.html
  26. 26. Сборка erlc -I include -o ebin src/*.erl
  27. 27. Сборка -I include -o ebin -DNAME=value -Werror src/*erl
  28. 28. Сборка 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]}]}.
  29. 29. Сборка src/myapp.app.src {application,metalkia, [{description,"web blog platform"}, {vsn,"1"}, {registered,[]}, {applications,[kernel,stdlib]}, {mod,{metalkia_app,[]}}, {env,[]}, {modules, []}]}.
  30. 30. Сборка C/C++ c_src
  31. 31. Сборка ErlyDTL templates/*.dtl → ebin/*_dtl.beam
  32. 32. Сборка Google Protocol Buffers src/*.proto → ebin/*_pb.beam, include/*_pb.hrl
  33. 33. Управление зависимостями {deps, [Dependency1, Dependency2, Dependency3]}.
  34. 34. Управление зависимостями Dependency: {App, VsnRegex, Source}
  35. 35. Управление зависимостями Source: {git, Url, Rev} {hg, Url, Rev} {bzr, Url, Rev}
  36. 36. Управление зависимостями Revision: {branch, "master"} {tag, "v1.0"} "62b7c9b12daacfcbcf274bc0925a7f8d10e3a1e0" "v1.0" "HEAD" ""
  37. 37. Управление зависимостями {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"}} ]}.
  38. 38. Управление зависимостями Зависимость от tag или commit Хорошо Зависимость от “HEAD”, {branch, “master”} не очень хорошо :(
  39. 39. Управление зависимостями Все зависимости сами должны быть Rebar проектами транзитивные тоже
  40. 40. Управление зависимостями Не rebar зависимость должна быть помечена [raw] {somelib, ".*", {git, "https://somewhere.com/somelib.git", "v1.0"}, [raw]}
  41. 41. Управление зависимостями rebar check-deps rebar list-deps rebar update-deps rebar delete-deps
  42. 42. Шаблоны rebar create template= [var=foo,...]
  43. 43. Шаблоны rebar create template=simpleapp appid=myapp rebar create template=simplesrv srvid=my_server
  44. 44. Шаблоны rebar create-app appid=myapp rebar create-node nodeid=mynode
  45. 45. Шаблоны rebar list-templates
  46. 46. Шаблоны 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")
  47. 47. Шаблоны 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
  48. 48. Шаблоны 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). ...
  49. 49. Шаблоны 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").
  50. 50. Шаблоны yura ~/p/rebar/priv/templates $ ls -1 *.template basicnif.template ctsuite.template simpleapp.template simplefsm.template simplemod.template simplenode.template simplesrv.template
  51. 51. Шаблоны 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"}.
  52. 52. Шаблоны simpleapp -- создает приложение simplesrv -- создает gen_server модуль simplemod -- создает пустой модуль
  53. 53. Шаблоны simplefsm -- создает gen_fsm модуль basicnif -- создает порт, erlang-модуль и с-файл ctsuite -- создает common test suite модуль simplenode -- создает файлы для релиза
  54. 54. Шаблоны ~/.rebar/templates либо клонировать rebar
  55. 55. Тестирование rebar eunit
  56. 56. Тестирование rebar eunit skip_deps=true
  57. 57. Тестирование rebar eunit skip_deps=true suites=module1_test
  58. 58. Тестирование rebar eunit skip_deps=true suites=”module1_test,module2_test”
  59. 59. Тестирование rebar eunit skip_deps=true suites=module1_test tests=some_test_fun
  60. 60. Тестирование rebar ct [suites=] [case=]
  61. 61. rebar.config rebar.config.sample
  62. 62. 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} ]}.
  63. 63. rebar.config src_dir deps_dir target_dir {erl_opts, [{i, "my_include"}]}
  64. 64. rebar.config Вложенные OTP-приложения {lib_dirs, ["deps", "apps"]}. {sub_dirs, ["apps/app1", "apps/app2"]}.
  65. 65. rebar.config {cover_enabled, true}. {clean_files, ["erl_crash.dump"]}.
  66. 66. rebar.config Настройки документированы слабо В чужих конфигах встречаются нигде не описанные опции Большинство настроек не нужно
  67. 67. rebar.config Нужно: {deps, []}. warning_as_error {parse_transform, lager_transform} и все :)
  68. 68. Escipt Создание и запуск консольных приложений на Erlang
  69. 69. Escipt Я делаю такие приложения на Bash или Python, но ...
  70. 70. Escipt Rebar сам является escript приложением
  71. 71. Escipt #!/usr/bin/env escript %%! -pa rebar/rebar/ebin полезная нагрузка
  72. 72. Escipt Исходный код Erlang Скомпилированный beam-файл Zip-архив с beam-файлами
  73. 73. Escipt Rebar представляет собой Zip-архив и его можно распаковать :) только сперва нужно переименовать
  74. 74. Escipt mv rebar rebar_file unzip rebar_file
  75. 75. 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 ...
  76. 76. Прочее rebar xref rebar qc rebar doc Сборка релизов
  77. 77. Вопросы?

×