basho/rebar — pull request #201 by marianoguerra (2012-03-13 09:52:35+00:00)
Title: include simplemodule.app.src in simplemod template

rebar fix
=========

let's create a simple erlang module using rebar::

# create module folder
mkdir modulo

# go to it
cd modulo

# download and set it to executable
wget http://cloud.github.com/downloads/basho/rebar/rebar && chmod u+x rebar

# create the module skeleton
./rebar create template=simplemod modid=modulo

now let's try to compile it::

➜ modulo ./rebar compile
==> modulo (compile)
➜ modulo tree
.
├── rebar
├── src
│ └── modulo.erl
└── test
└── modulo_tests.erl

2 directories, 3 files

nothing happened :(

it seems something is missing, let's add the app.src file::

➜ modulo vim src/modulo.app.src
➜ modulo cat src/modulo.app.src
{application, modulo, [
{description, "super useful module."},
{vsn, "0.0.1"},
{env, []}
]}.

and try again::

➜ modulo ./rebar compile
==> modulo (compile)
Compiled src/modulo.erl
➜ modulo tree
.
├── ebin
│ ├── modulo.app
│ └── modulo.beam
├── rebar
├── src
│ ├── modulo.app.src
│ └── modulo.erl
└── test
└── modulo_tests.erl

3 directories, 6 files

success!

then the simplemod template needs the app.src file to be complete.

let's try fixing that, first fork rebar from github.com/basho/rebar.

then clone it::

git clone git@github.com:marianoguerra/rebar.git

cd rebar

let's see where the templates are::

➜ rebar git:(master) find -name simplemod\*
./priv/templates/simplemod_tests.erl
./priv/templates/simplemod.erl
./priv/templates/simplemod.template

➜ rebar git:(master) cd priv/templates

now let's be a nice git citizen and create a branch for this fix::

git checkout -b simplemod-app-src-missing

looking at the other templates they have a file like **simpleapp.app.src**

where simpleapp is the name of the template.

looking at the content::

{application, {{appid}},
[
{description, ""},
{vsn, "1"},
{registered, []},
{applications, [
kernel,
stdlib
]},
{mod, { {{appid}}_app, []}},
{env, []}
]}.

seems to be a template were appid is the variable to be replaced, let's try
with that::

# copy the file
cp simpleapp.app.src simplemod.app.src
# some sed spells
sed -i 's/appid/modid/g' simplemod.app.src

let's see the content with **cat simplemod.app.src**::

{application, {{modid}},
[
{description, ""},
{vsn, "1"},
{registered, []},
{applications, [
kernel,
stdlib
]},
{mod, { {{modid}}_app, []}},
{env, []}
]}.

and add the new file to the template definition::

echo '{template, "simplemod.app.src", "src/{{modid}}.app.src"}.' >> simplemod.template

and see the new content::

cat simplemod.template

{variables, [{modid, "mymod"}]}.
{template, "simplemod.erl", "src/{{modid}}.erl"}.
{template, "simplemod_tests.erl", "test/{{modid}}_tests.erl"}.
{template, "simplemod.app.src", "src/{{modid}}.app.src"}.

let's build the new version (inside the base rebar folder)::

./bootstrap

now let's try our new version::

mkdir /tmp/modulo
cp rebar /tmp/modulo
cd /tmp/modulo

./rebar create template=simplemod modid=modulo

==> modulo (create)
Writing src/modulo.erl
Writing test/modulo_tests.erl
Writing src/modulo.app.src

➜ modulo ./rebar compile
==> modulo (compile)
Compiled src/modulo.erl

➜ modulo tree
.
├── ebin
│ ├── modulo.app
│ └── modulo.beam
├── rebar
├── src
│ ├── modulo.app.src
│ └── modulo.erl
└── test
└── modulo_tests.erl

3 directories, 6 files

success!