У меня странная проблема при создании релиза приложения erlang, над которым я работаю, с использованием арматуры. По сути, он не может найти клиент Erlang Thrift, который установлен в моей системе. Я могу убедиться в этом, загрузив комиссионное приложение из командной строки 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>
Однако, когда я пытаюсь запустить 'rebar generate', чтобы создать релиз моего приложения, происходит сбой:
$ 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)
Вот мой файл приложения, 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"]}
]}
]}.
... и мой 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"}
]}.
Я должен отметить, что если я удаляю Thrift из списка приложений в обоих, релиз генерирует, но не включает в себя библиотеки Thrift, и, следовательно, дает сбой во время выполнения. Сможет ли кто-нибудь подсказать мне, что я здесь делаю неправильно?
Большое спасибо,
Тим