Skip to content

Instantly share code, notes, and snippets.

@skeptomai
Created April 14, 2010 20:50
Show Gist options
  • Save skeptomai/366330 to your computer and use it in GitHub Desktop.
Save skeptomai/366330 to your computer and use it in GitHub Desktop.

How to create, build and run an OTP application using Rebar

Get Rebar from bitbucket.org

hg clone http://hg.basho.com/rebar/

Build Rebar

  ./bootstrap 
==> rebar (compile)
Congratulations! You now have a self-contained script called "rebar" in
your current working directory. Place this script anywhere in your path
and you can use rebar to build OTP-compliant apps.

Create project directory and copy rebar script to it

mkdir document-rebar
cd document-rebar/
cp ../rebar/rebar .

Create OTP application files

./rebar create-app appid=myapp
  ==> document-rebar (create-app)
  Writing ebin/myapp.app
  Writing src/myapp_app.erl
  Writing src/myapp_sup.erl

Create apps directory and move files

mkdir -p apps/myapp
mv ebin apps/myapp
mv src apps/myapp

Edit rebar.config

{sub_dirs, ["apps/myapp", "rel"]}.

Create release directory and files

mkdir rel
cd rel
../rebar create-node nodeid=myapp
  ==> rel (create-node)
  Writing reltool.config
  Writing overlay/erts-vsn/bin/erl
  Writing overlay/erts-vsn/bin/nodetool
  Writing overlay/bin/myapp
  Writing overlay/etc/app.config
  Writing overlay/etc/vm.args
cd ..

Edit reltool.config

{sys, [
  {lib_dirs, ["../apps"]},
  {rel, "myapp", "1",
    [
      kernel,
      stdlib,
      sasl,
      myapp
    ]},
  {rel, "start_clean", "",
    [
      kernel,
      stdlib
    ]},
  {boot_rel, "myapp"},
  {profile, embedded},
  {excl_sys_filters, ["^bin/.*",
    "^erts.*/bin/(dialyzer|typer)"]},
  {app, myapp, [{incl_cond, include}]},
  {app, sasl, [{incl_cond, include}]}
  ]}.

{rebar, [
  {empty_dirs, [
    "log/sasl"
  ]},

{overlay, "overlay"}
]}.

Make startup script executable

chmod aog+x ./rel/overlay/bin/myapp 

Compile

./rebar -v compile
DEBUG:Rebar location: "/Users/cb/Projects/document-rebar/rebar"
DEBUG:/Users/cb/Projects/document-rebar: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar subdirs: ["/Users/cb/Projects/document-rebar/apps/myapp",
"/Users/cb/Projects/document-rebar/rel"]
DEBUG:/Users/cb/Projects/document-rebar/apps/myapp: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar/apps/myapp subdirs: []
==> myapp (compile)
DEBUG:Starting 3 compile worker(s)
DEBUG:Worker exited cleanly
Compiled src/myapp_app.erl
Compiled src/myapp_sup.erl
DEBUG:Worker exited cleanly
DEBUG:Worker exited cleanly
DEBUG:/Users/cb/Projects/document-rebar/rel: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar/rel subdirs: []

Build Release

./rebar -v generate
DEBUG:Rebar location: "/Users/cb/Projects/document-rebar/rebar"
DEBUG:/Users/cb/Projects/document-rebar: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar subdirs: ["/Users/cb/Projects/document-rebar/apps/myapp",
"/Users/cb/Projects/document-rebar/rel"]
DEBUG:/Users/cb/Projects/document-rebar/apps/myapp: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar/apps/myapp subdirs: []
DEBUG:/Users/cb/Projects/document-rebar/rel: Using deps dir: /Users/cb/Projects/document-rebar/deps
DEBUG:/Users/cb/Projects/document-rebar/rel subdirs: []
==> rel (generate)

Test

./rel/myapp/bin/myapp console
Exec:
/Users/cb/Projects/document-rebar/rel/myapp/erts-5.7.4/bin/erlexec
 -boot /Users/cb/Projects/document-rebar/rel/myapp/releases/1/myapp
 -embedded -config
 /Users/cb/Projects/document-rebar/rel/myapp/etc/app.config
 -args_file /Users/cb/Projects/document-rebar/rel/myapp/etc/vm.args
 -- console
Root: /Users/cb/Projects/document-rebar/rel/myapp
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:5] [kernel-poll:true]

Eshell V5.7.4  (abort with ^G)
(myapp@127.0.0.1)1> application:which_applications().
[{myapp,[],"1"},
{sasl,"SASL  CXC 138 11","2.1.8"},
{stdlib,"ERTS  CXC 138 10","1.16.4"},
{kernel,"ERTS  CXC 138 10","2.13.4"}]

org-mode configuration

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment