11

私は一般的に rebar と erlang の初心者です。このチュートリアルに従って rebar を使用して erlang リリースを作成しようとしていました: http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgradesで、生成されたリリースを実行する時点で行き詰まりました。

私のシステムは、ソースからインストールされた Ubuntu 11.04 64 ビット、erlang R14B03 です。

「bin/somenode console」を呼び出すと、次のいずれかのエラーが発生します。

Exec: /home/ghik/Inz/somerel/rel/somenode/erts-5.8.4/bin/erlexec -boot /home/ghik/Inz/somerel/rel/somenode/releases/1/somenode -mode embedded -config /home/ghik/Inz/somerel/rel/somenode/etc/app.config -args_file /home/ghik/Inz/somerel/rel/somenode/etc/vm.args -- console
Root: /home/ghik/Inz/somerel/rel/somenode
{"init terminating in do_boot",{'cannot load',hipe_amd64_encode,get_files}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

興味深いことに、実行するたびに、「hipe_amd64_encode」の代わりに別のアトムがリストされます。たとえば、「hipe_amd64_defuse」、「hipe_amd64_assembly」などです。おそらく、erlang は hipe をロードできないと思いますが、なぜそうなのかわかりませんそもそもロードしようとしています。このリリースには、カーネルと stdlib のみに依存する非常に単純なアプリケーションが 1 つだけ含まれています。

何らかの理由で、rebar は多くの不要なアプリケーションを含む .rel ファイルを生成します。

%% rel generated at {2011,9,6} {20,5,48}
{release,{"somenode","1"},
     {erts,"5.8.4"},
     [{kernel,"2.14.4"},
      {stdlib,"1.17.4"},
      {sasl,"2.1.9.4"},
      {someapp,"1"},
      {compiler,"4.7.4",load},
      {crypto,"2.0.3",load},
      {et,"1.4.3",load},
      {gs,"1.5.13",load},
      {hipe,"3.8",load},
      {inets,"5.6",load},
      {mnesia,"4.4.19",load},
      {observer,"0.9.9",load},
      {public_key,"0.12",load},
      {runtime_tools,"1.8.5",load},
      {ssl,"4.1.5",load},
      {syntax_tools,"1.6.7.1",load},
      {tools,"2.6.6.4",load},
      {webtool,"0.8.8",load},
      {wx,"0.98.10",load}]}.

rebar の .rel ファイルに非常に多くのアプリケーションがリストされているのはなぜですか? そして、もしよろしければ、なぜリリースが開始されないのでしょうか?

4

4 に答える 4

13

reltool.configに次の行を追加します。

{app, hipe, [{incl_cond, exclude}]}
于 2011-12-02T08:11:11.060 に答える
9

まず、VM に引数init_debugを追加することで、VM の起動中に何が失敗するかを確認できます。

$ erl -init_debug
{progress,preloaded}
{progress,kernel_load_completed}
{progress,modules_loaded}
{start,heart}
{start,error_logger}
{start,application_controller}
{progress,init_kernel_started}
...
{progress,applications_loaded}
{apply,{application,start_boot,[kernel,permanent]}}
{apply,{application,start_boot,[stdlib,permanent]}}
{apply,{c,erlangrc,[]}}
{progress,started}
Erlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.4  (abort with ^G)
1>

これを使用すると、進行中の相互作用の種類をより詳細に確認できます。ライブラリが間違った順序でロードされている、ネイティブをサポートしていないなどの可能性があります。


2 つ目の問題は、rel ファイルに含まれるアプリケーションが多すぎることです。これは、Rebar がリリースを生成するために Reltool を使用し、リリースを生成するときのコントロールの粒度に応じて、さまざまなアプリケーションをロードできることが原因である可能性があります (incl_condドキュメントの資料を参照)。これについては、Learn You Some Erlang のRelease is The Word の章にいくつかの例があります。

{sys, [
 {lib_dirs, ["/home/ferd/code/learn-you-some-erlang/release/"]},
 {erts, [{mod_cond, derived}, % derived makes it pick less stuff
         {app_file, strip}]},
 {rel, "erlcount", "1.0.0", [kernel, stdlib, ppool, erlcount]},
 {boot_rel, "erlcount"},
 {relocatable, true},
 {profile, embedded}, % reduces the files included from each app
 {app_file, strip}, % reduces the size of app files if possible
 {incl_cond, exclude}, % by default, don't include apps. 'derived' is another option
 {app, stdlib, [{mod_cond, derived}, {incl_cond, include}]}, % include at the app
 {app, kernel, [{incl_cond, include}]},                      % level overrides the
 {app, ppool, [{vsn, "1.0.0"}, {incl_cond, include}]},       % exclude put earlier
 {app, erlcount, [{vsn, "1.0.0"}, {incl_cond, include}]}
]}.

これにより、より小さなリリースが生成されるはずです。

于 2011-09-08T16:58:47.300 に答える
0

最近、この投稿を見つけました: http://mokele.co.uk/2011/07/01/rebar-release-upgrade-caeats.html

rebar のエラーのリストが明らかになり、そのうちの 1 つが私のリリースを起動できなかった理由です。公開されている修正もあります。できるだけ早くメインの鉄筋リポジトリにマージされることを願っています.

于 2011-09-22T20:55:10.073 に答える