Search code examples
erlangrebar

How to handle deps while using rebar to release?


I'm using rebar generate to handle release, but when I start the application, the deps I use will not be found.`

I can start the application manually using erl -pa ./ebin ./deps/*/ebin -s myapp.

I'm wonder how to config rebar.config and reltool.config to handle dependencies? Thanks.


Solution

  • In order for reltool to generate a release which includes the dependencies, you will need to add them to reltool.config. I have an application called drill_instructor, which has the following reltool.config. The lines like {app, stdlib, [{incl_cond, include}]}, tell reltool to include that application in the release. I also added deps to the lib_dirs setting.

    {sys, [
       {lib_dirs, ["../deps"]},
       {erts, [{mod_cond, derived}, {app_file, strip}]},
       {app_file, strip},
       {rel, "drill_instructor", "1",
        [
         kernel,
         stdlib,
         sasl,
         crypto,
         ranch,
         jiffy,
         cowboy,
         jiffy,
         drill_instructor
        ]},
       {rel, "start_clean", "",
        [
         kernel,
         stdlib
        ]},
       {boot_rel, "drill_instructor"},
       {profile, embedded},
       {incl_cond, exclude},
       {excl_archive_filters, [".*"]}, %% Do not archive built libs
       {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
                           "^erts.*/(doc|info|include|lib|man|src)"]},
       {excl_app_filters, ["\.gitignore"]},
       {app, sasl,   [{incl_cond, include}]},
       {app, crypto,   [{incl_cond, include}]},
       {app, stdlib, [{incl_cond, include}]},
       {app, kernel, [{incl_cond, include}]},
       {app, cowboy, [{incl_cond, include}]},
       {app, ranch, [{incl_cond, include}]},
       {app, jiffy, [{incl_cond, include}]},
       {app, drill_armory, [{incl_cond, include}]},
       {app, drill_instructor, [{incl_cond, include}, {lib_dir, ".."}]}
      ]}.
    
    {target_dir, "drill_instructor"}.
    
    {overlay, [
           {mkdir, "log/sasl"},
           {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
           {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"},
           {copy, "files/drill_instructor", "bin/drill_instructor"},
           {copy, "files/drill_instructor.cmd", "bin/drill_instructor.cmd"},
           {copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
           {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"},
           {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
           {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
          ]}.
    

    In the rebar.config, I also added rel as a sub_dir:

    {sub_dirs, ["rel"]}.