[erlang-questions] mini rebar recipe, (Was Re: escript and archives )
Tim Watson
watson.timothy@REDACTED
Wed Oct 19 11:07:22 CEST 2011
Thanks for posting the solution. Using `rebar escriptize` you can also
configure the generated archive in a number of ways:
- escript_incl_apps lists applications whose beam files should also be
bundled into the archive
- escript_shebang adds a custom shebang to the generated escript/archive
- escript_emu_args allows you to pass custom emulator arguments to the
generated escript/archive
Cheers
On 19 October 2011 09:16, Angel J. Alvarez Miguel <clist@REDACTED> wrote:
> as nobody care about this question, i post this just for newbies like me.
>
> I ended using rebar...
>
> i created a .src rebar file for my setup.
>
> walker.app.src
>
> {application, walker,
> [
> {description, ""},
> {vsn, "1"},
> {registered, []},
> {applications, [
> kernel,
> stdlib
> ]},
> {mod, { walker, []}},
> {env, []}
> ]}.
>
> and then having my walker.erl and the getopt.erl filesin my src directory
>
> i did "rebar compile" and then "rebar escriptize", rebar cares of
> generating a walker.app file
> and then packages all the beam files and the app making a fresh escript
> file.
>
> So you have to make a app file to allow escript manage the zip file..
>
> This is the result app file:
>
>
> {application,walker,
> [{description,[]},
> {vsn,"1"},
> {registered,[]},
> {applications,[kernel,stdlib]},
> {mod,{walker,[]}},
> {env,[]},
> {modules,[getopt,walker]}]}.
>
> Just for the record the walker.erl (a rip of ex1.erl from getopt) is :
>
> -module(walker).
>
> -export([main/1]).
>
> %% as of getopt examples
> option_spec_list() ->
> CurrentUser = case os:getenv("USER") of
> false -> "user";
> User -> User
> end,
> [
> {recursion, $r, "recurse", {boolean,false},
> "Recurse over directory contents"},
> {directory, undefined, undefined, string,
> "Target directory"}
> ].
>
> main([]) ->
> getopt:usage(option_spec_list(), escript:script_name());
> main(Args) ->
> OptSpecList = option_spec_list(),
> io:format("Args (~p) ~ngetopt:parse/2 returns:~n~n", [Args]),
> case getopt:parse(OptSpecList, Args) of
> {ok, {Options, NonOptArgs}} ->
> io:format("Options:~n ~p~n~nNon-option arguments:~n
> ~p~n", [Options, NonOptArgs]),
> case proplists:is_defined(directory,Options) of
> true -> do_walk(Options);
> false -> getopt:usage(OptSpecList,
> escript:script_name()) %% No target directory?
> end;
> {error, {Reason, Data}} ->
> io:format("Error: ~s ~p~n~n", [Reason, Data]),
> getopt:usage(OptSpecList, escript:script_name())
> end.
>
> do_walk(Args) ->
> Files = filelib:fold_files(proplists:get_value(directory,Args),
> ".*",
> proplists:get_bool(recursion,Args),
> fun(Path, Acc) ->
> io:format("Procesando fichero ~s \n",[Path]),
> {ok, Bin} = file:read_file(Path),
> [{Path, Bin}|Acc] end,
> []).
>
>
> (A simple escript exercise for un cmdline tool that im planning to do)
>
>
> /Angel
>
> On Martes, 18 de Octubre de 2011 10:47:31 Angel J. Alvarez Miguel escribió:
> > Hi,
> >
> > I want to packe some beams on a .ez archive and then insert the escript
> > header to get a selfcontaines script ala rebar..
> >
> > i made a script witth a zip archive the usual way..
> >
> > Files = filelib:fold_files("./ebin",
> > ".*",
> > true,
> > fun(Path, Acc) ->
> > io:format("Procesando fichero ~s
> \n",[Path]),
> > {ok, Bin} = file:read_file(Path),
> > [{Path, Bin}|Acc] end,
> > []),
> > {ok, {"mem", ZipBin}} = zip:create("mem", Files, [memory]),
> > Script = <<"#!/usr/bin/env escript\n%%! -noshell -noinput\n",
> > ZipBin/binary>>,
> >
> > ok = file:write_file("walker", Script),
> > os:cmd("chmod u+x walker"),
> >
> >
> > i have my ebin dir with my two test files, the getopt.erl from jcomellas
> > git and a simple walker.erl file:
> >
> > -module(walker).
> >
> > -export([main/1]).
> >
> > main([String]) ->
> > io:format("Up and running!! mayormente... (args:~s )\n",[String]),
> > halt(0);
> >
> > main(_) ->
> > io:format("Uso: ~s <args> \n",[escript:script_name()]),
> > halt(1).
> >
> >
> > but then escript doesnt find the walker file:
> >
> > ./walker
> > escript: exception error: undefined function walker:main/1
> > in function escript:run/2
> > in call from escript:start/1
> > in call from init:start_it/1
> > in call from init:start_em/1
> >
> > if I place the escript into the ebin files it obviouosly find the waker
> > module but is the .beam that is there!.
> >
> >
> > Do need I to include a "walker.app" to allow script to find where my
> main
> > function is from the zip archive?
> >
> >
> > Regards, Angel
> > _______________________________________________
> > erlang-questions mailing list
> > erlang-questions@REDACTED
> > http://erlang.org/mailman/listinfo/erlang-questions
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20111019/2f1244be/attachment.htm>
More information about the erlang-questions
mailing list