dreamxyp 发表于 2017-8-17 16:37:29

erlang开发环境时beam 自动加载。提高开发效率

erlang开发要手动去c:l() 改动的模块。弄个自动加载的mod 提高开发效率
-module('_reload_beam').

%% --------------------------------------------------------------------
%% Include files
%% --------------------------------------------------------------------
-include("comm.lib.hrl").
-include("mod.db.hrl").
-include_lib("kernel/include/file.hrl").

%% ====================================================================
%% API functions
%% ====================================================================
-export().
      
%% @author [email protected]
%% @用法:   每秒调用 _reload_beam:do() 一次,自动检查是否有文件更新并加载
%%            1.生产环境 每239秒检查一次
%%            2.开发环境 每秒检查一次 (默认)
do() ->
      case filelib:is_file("/data/game_server/release.txt") of
                ?true -> %% 生产环境(条件可以自己定义)
                        NKEY= {?MODULE,'_reload_do_'},
                        NTime = util_time:seconds(),
                        case ets:lookup(?ETS_S_CONFIG,NKEY) of
                              [{_,OTime}|_] ->
                                        ?IF(NTime - OTime > 239,begin do2(), ets:insert(?ETS_S_CONFIG, {NKEY, NTime}) end, ?skip);
                              []            ->
                                        ets:insert(?ETS_S_CONFIG, {NKEY, NTime});
                              _             ->
                                        ?skip
                        end;
                ?false -> %% 开发环境
                        do2()
      end.
                                                               
do2() ->
    [case file:read_file_info(Filename) of
         {ok, #file_info{mtime = Mtime}} ->
                         case ets:lookup(?ETS_S_CONFIG,{?MODULE,Module}) of
                                 [{_,OTime}|_] ->
                                       ?IF(Mtime > OTime,      reload(Module,Mtime), ?skip);
                                 [] ->
                                       ets:insert(?ETS_S_CONFIG, {{?MODULE,Module},   Mtime});
                                 _-> ?skip
                         end;
         {?ok, _ }      -> ?skip;
         {?error, enoent} -> ?skip;
         {?error, Reason} ->
             ?MSG_ERROR("Error reading ~s's file info: ~p~n",),
             ?error
   end || {Module, Filename} <- code:all_loaded(), is_list(Filename)].

reload(Module,Mtime)->
      c:l(Module),
      ets:insert(?ETS_S_CONFIG, {{?MODULE,Module},Mtime}),
      ?MSG_ECHO("Reloading ~p reload ok test ok!",).

茶叶feng 发表于 2018-9-3 16:00:50

试了一下,感觉还不错,改代码就不用总是编译后再手动加载了
页: [1]
查看完整版本: erlang开发环境时beam 自动加载。提高开发效率