"Rebar Generate" non include alcune dipendenze nel rilascio generato
Domanda
Ho uno strano problema di costruire un rilascio di un'applicazione Erlang a cui sto lavorando, usando l'armatura. In sostanza, non riesce a individuare il client dell'usato Erlang, che è installato sul mio sistema. Posso verificarlo caricando l'applicazione dell'usato dal prompt Erlang:
$ erl
Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
Eshell V5.8.5 (abort with ^G)
1> application:load(thrift).
ok
2> application:loaded_applications().
[{kernel,"ERTS CXC 138 10","2.14.5"},
{thrift,"Thrift bindings","0.9.0-dev"},
{stdlib,"ERTS CXC 138 10","1.17.5"}]
3>
Tuttavia, quando provo a eseguire "Rebar Generate" per creare un rilascio della mia applicazione, fallisce:
$ rebar generate
==> rel (generate)
{"init terminating in do_boot","Release fern uses non existing application thrift"}
Crash dump was written to: erl_crash.dump
init terminating in do_boot (Release fern uses non existing application thrift)
Ecco il mio file di applicazione, Fern.app.src:
{application, fern, [
{description, "elided"},
{vsn, "0.5.0"},
{modules, [
fern_app,
fern_sup,
accounts_repository,
fern_http_request,
fern_system_api,
metadata_fetcher,
metadata_process,
repository,
repository_server,
timestamps_repository,
hbase_thrift,
hbase_types,
utils
]},
{registered, [
fern_sup
]},
{applications, [
kernel,
stdlib,
inets,
ssl
]},
{mod, { fern_app, []}},
{env, []},
{agner, [
{requires, ["jiffy", "meck", "mochiweb"]}
]}
]}.
... e il mio reltool.config:
{sys, [
{lib_dirs, ["../apps", "../deps"]},
{erts, [{mod_cond, derived}, {app_file, strip}]},
{app_file, strip},
{rel, "fern", "1",
[
kernel,
stdlib,
sasl,
ssl,
inets,
thrift,
fern
]},
{rel, "start_clean", "",
[
kernel,
stdlib
]},
{boot_rel, "fern"},
{profile, embedded},
{incl_cond, exclude},
{excl_archive_filters, [".*"]}, %% Do not archive built libs
{excl_sys_filters, ["^bin/.*", "^erts.*/doc", "^erts.*/src",
"^erts.*/info", "^erts.*/man",
"^erts.*/lib", "^erts.*/include",
"^erts.*/bin/(dialyzer|typer)"]},
{excl_app_filters, ["\.gitignore"]},
{app, sasl, [{incl_cond, include}]},
{app, stdlib, [{incl_cond, include}]},
{app, kernel, [{incl_cond, include}]},
{app, inets, [{incl_cond, include}]},
{app, crypto, [{incl_cond, include}]},
{app, public_key, [{incl_cond, include}]},
{app, ssl, [{incl_cond, include}]},
{app, thrift, [{incl_cond, include}]},
{app, fern, [{incl_cond, include}]}
]}.
{target_dir, "fern"}.
{overlay, [
{mkdir, "log/sasl"},
{copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
{copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"},
{copy, "files/fern", "bin/fern"},
{copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
{copy, "files/fern.cmd", "bin/fern.cmd"},
{copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
{copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
]}.
Devo notare che se rimuovo la parsimonia dall'elenco delle applicazioni in entrambi, la versione genera, ma non include le librerie dell'usato e quindi fallisce in fase di esecuzione. Qualcuno sarebbe in grado di offrirmi qualsiasi guida su ciò che sto facendo di sbagliato qui?
Grazie molto,
Tim
Soluzione
Per il bene di chiunque altro che si imbatte in questo - alla fine ho risolto il problema. Per qualche motivo, l'armatura rinomina l'applicazione "Thrift" in "Thrift-0.9.0-dev" all'interno del rilascio. Modifica di tutte le istanze dell'atomo "Thrift" nella configurazione sopra in "Thrift-0.9.0-dev" (Nota che questo è un atomo, non una stringa-usa singole citazioni) lo risolverà.