来自:http://blog.csdn.net/yangzm/article/details/51484465

rebar打包和发布应用(参考:https://github.com/rebar/rebar/wiki)。

主要说明一些过程和要注意的问题:

1. 生成的create-app create-node 生的文件名要一样的,如果不一样,以后会找不到文件时边的方法。

2. 添加的新类从rebar create template=simplesrv srvid=myapp_server 命令增加,增加后对里边的方法进入实现,如果只增加一个最简单的类,是不行的,最后的调用

会找不到方法名。

1 查看rebar 命令信息

rebar -c 可以看到我们常用的命令。

2 创建项目

按照下面的命令创建一个新的项目test_rebar:

[plain]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1.  $ mkdir test_rebar  
  2.  $ cd test_rebar/  
  3.  $ rebar create-app appid=myapp 
  4.  $ mkdir rel  
  5.  $ cd rel  
  6.  $ rebar create-node nodeid=myapp 
  7.  $ vi reltool.config  (替换一行中的:{lib_dir,".."},这个在文件夹rel下边的,reltool.config files是create-node生成的 )
  8.  $ cd ..  
  9.  $ echo "{sub_dirs,[\"rel\"]}.">rebar.config ( rel src目录 和rebar.config文件 这三个同目录 ) 
  10.  $ rebar compile generate (在test_rebar 目录下边) 
  11. ==> rel (generate)  
  12. WARN:  'generate' command does not apply to directory ~/test_rebar  
其中,$ vi reltool.config执行时,找到下面这行:

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. {app, mynode, [{mod_cond, app}, {incl_cond, include}]}  
更改为:

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. {app, mynode, [{mod_cond, app}, {incl_cond, include}, {lib_dir,".."}]}  

3 简单运行

[plain]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. $ pwd  
  2. ./test_rebar/rel/mynode/bin  
  3. $ ./mynode start  
  4. $ ./mynode attach  
  5. Attaching to /tmp//~/test_rebar/rel/mynode/erlang.pipe.1 (^D to exit)  
  6.   
  7. (mynode@127.0.0.1)1> application:which_applications().  
  8. [{mynode,[],[]},  
  9.  {sasl,"SASL  CXC 138 11","2.4.1"},  
  10.  {stdlib,"ERTS  CXC 138 10","2.2"},  
  11.  {kernel,"ERTS  CXC 138 10","3.0.3"}]  
  12. (mynode@127.0.0.1)2> q().  
  13. ok  
  14. (mynode@127.0.0.1)3> [End]  
  15. $ ./mynode start  
  16. $ ./mynode stop  
  17. ok 

    4 添加业务逻辑

   A。 添加文件

  1. 进入到目录 test_rebar 目录里边,现在的src 只有刚才的三个文件,我们现在要加入我们自己的代码用于测试:

  2. rebar create template=simplesrv srvid=myapp_server
  3. rebar create template=simplesrv srvid=myapp_hello
  4. 生成两个新的gen_server 这里我测下来,一定要用gen_server或otp的基类生成的erl,否则最后出现没有这个函数。

  B。 修改:myapp_sup.erl  (主用于出错后的启动)

    Child = ?CHILD(myapp_hello,worker),
    Child2 = ?CHILD(myapp_server,worker), 
    {ok, { {one_for_one, 5, 10}, [Child,Child2]} }.

  C.  修改:myapp.app.src  (告诉加载哪几个模块,否则找不到)

    {application, myapp,
 [
  {description, ""},
  {vsn, "1"},
  {modules,[myapp_app,myapp_sup,myapp_server,myapp_hello]},
  {registered, [myapp_server,myapp_hello]},
  {applications, [
                  kernel,
                  stdlib
                 ]},
  {mod, { myapp_app, []}},
  {env, []}
 ]}.

  d. 修改: myapp_hello.erl 

-module(myapp_hello).

-behaviour(gen_server).
-export([start_link/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
     terminate/2, code_change/3]).
-compile(export_all).
-define(SERVER, ?MODULE). 

start1()->
     io:format("~p~n",["hello....."]).
     
start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
stop()  -> gen_server:call(?MODULE, stop).

new_account(Who)      -> gen_server:call(?MODULE, {new, Who}).
deposit(Who, Amount)  -> gen_server:call(?MODULE, {add, Who, Amount}).
withdraw(Who, Amount) -> gen_server:call(?MODULE, {remove, Who, Amount}).

init([]) -> {ok, ets:new(?MODULE,[])}.

handle_call({new,Who}, _From, Tab) ->
    Reply = {welcome123, Who},
    {reply, Reply, Tab};
    
handle_call({add,Who,X}, _From, Tab) ->
    Reply = case ets:lookup(Tab, Who) of
        []  -> not_a_customer;
        [{Who,Balance}] ->
            NewBalance = Balance + X,
            ets:insert(Tab, {Who, NewBalance}),
            {thanks, Who, your_balance_is,  NewBalance} 
        end,
    {reply, Reply, Tab};
    
handle_call({remove,Who, X}, _From, Tab) ->
    Reply = case ets:lookup(Tab, Who) of
        []  -> not_a_customer;
        [{Who,Balance}] when X =< Balance ->
            NewBalance = Balance - X,
            ets:insert(Tab, {Who, NewBalance}),
            {thanks, Who, your_balance_is,  NewBalance};    
        [{Who,Balance}] ->
            {sorry,Who,you_only_have,Balance,in_the_bank}
        end,
    {reply, Reply, Tab};
    
handle_call(stop, _From, Tab) ->
    {stop, normal, stopped, Tab}.
handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.

///

   e. 现在可以到test_rebar 目录下边了,进行编译。

     rebar clean

     rebar compile generate

     之后在rel目录下边生成一堆文件。

     cd rel

     cd bin

     ./myapp start

     ./myapp attach

      myapp_hello:start1().

      // 这时打出了正确的结果。


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐