2011-09-06 19 views
11

Tôi là người mới bắt đầu với cốt thép và erlang nói chung. Tôi đã cố gắng để tạo ra một phiên bản erlang với cốt thép theo hướng dẫn này: http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades và bị kẹt tại thời điểm chạy bản phát hành được tạo.Không thể bắt đầu phát hành mẫu erlang được tạo ra bằng thép cây

Hệ thống của tôi là Ubuntu 11.04 64bit, erlang R14B03, được cài đặt từ các nguồn.

Khi tôi gọi 'bin/somenode console', tôi nhận được một trong các lỗi sau đây:

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() 

Điều thú vị là mỗi khi tôi chạy nó, nguyên tử khác nhau được niêm yết thay vì 'hipe_amd64_encode', ví ví dụ: 'hipe_amd64_defuse', 'hipe_amd64_assemble', v.v. Tôi đoán rằng erlang không thể tải hipe, nhưng tôi không biết tại sao lại cố gắng tải nó ở vị trí đầu tiên. Bản phát hành chỉ chứa một, ứng dụng rất đơn giản chỉ phụ thuộc vào hạt nhân và stdlib.

Đối với một số lý do, cốt thép tạo ra một tập tin .rel với rất nhiều ứng dụng không cần thiết:

%% 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}]}. 

Tại sao danh sách cốt thép soo nhiều ứng dụng trong file .rel? Và sự kiện nếu nó ổn, tại sao bản phát hành không bắt đầu?

Trả lời

9

Trước hết, bạn có thể thử để xem những gì thất bại trong khởi động của máy ảo bằng cách thêm các đối số 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> 

Sử dụng này, bạn sẽ có thể nhìn thấy bằng biết thêm chi tiết loại tương tác đang diễn ra. Có thể thư viện đang được tải theo thứ tự sai, bạn không hỗ trợ gốc, v.v.


Vấn đề thứ hai, tệp rel chứa quá nhiều ứng dụng. Điều này có thể là do Rebar sử dụng Reltool ot tạo ra các bản phát hành và các ứng dụng khác nhau có thể được tải tùy thuộc vào mức độ kiểm soát của các bản phát hành (xem tài liệu incl_cond trong tài liệu). Có một vài ví dụ cho điều này trong các Release is The Word chương của Learn Bạn Một số Erlang:

{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}]} 
]}. 

Và điều này sẽ tạo ra các phiên bản nhỏ hơn.

+5

Tôi chỉ cần thêm {ứng dụng, hipe, [{incl_cond, loại trừ}]} để reltool.config và nó hoạt động cho bây giờ. Cảm ơn vì sự giúp đỡ. – ghik

0

Tôi không biết câu trả lời hay, nhưng tôi biết rằng tôi không thể bắt đầu bản phát hành chạy trên một số phiên bản CentOS với một vài hạt nhân khác nhau, vì vậy điều này không chính xác bất thường. Nâng cấp lên 5.6 làm cho nó cuối cùng hoạt động. Bạn có thể thấy hệ điều hành thực sự đi xét nghiệm mỗi ngày ở đây:

http://www.erlang.org/doc/installation_guide/INSTALL.html#id62915

Ngoài ra, bạn có thể biên dịch mà không HIPE, tôi đoán.

0

Gần đây tôi thấy bài viết này: http://mokele.co.uk/2011/07/01/rebar-release-upgrade-caveats.html

Nó phát hiện ra một danh sách các lỗi trong cốt thép, một trong số đó là lý do tại sao phiên bản của tôi không thể khởi động. Ngoài ra còn có các bản sửa lỗi được xuất bản. Tôi hy vọng họ sẽ được sáp nhập vào kho lưu trữ cốt thép chính ASAP.

13

Thêm vào reltool.config, dòng sau:

{app, hipe, [{incl_cond, exclude}]} 
Các vấn đề liên quan