erlang代码热加载

最近用erlang开发项目,用rebar3进行项目的管理,在linux环境下运行,开发过程中要对代码进行测试测试,项目启动后,测试过程中会发现一些小的问题,代码修改后要执行:rebar3 shell,重新启动项目才能把更新后的代码加载到项目中,感觉很麻烦和费时。

想着可以不用重启项目的情况下,部署更新后的代码,于是查资料已便可以找到一个解决方案。主要思路:是在应用启动后,在应用的根目录下,不停止应用执行一个简单编译命令,就可以让变更后的代码生效,最终写了下面的代码:

-module(userc).
-author("pingjianwei").
%% API
-compile(export_all).
%% 宏WORK_DIRS里,列出的目录是项目开发过程中经常改动
%%的代码的目录,这些目录的路径全是相对于项目的根目录。
-define(WORK_DIRS, [
  "src/",
  "src/repo/",
  "src/model/",
  "src/protocol/model/",
  "src/protocol/model/mcht/",
  "src/protocol/model/ums/",
  "src/protocol/model/up/",
  "src/protocol/processor/",
  "src/ums/",
  "src/utils/",
  "src/web_handle/",
  "src/web_rest_api/"
]).
%% 定义头文件的目录
-define(INCLUDE_DIRS, ["/src/include/"]).

cfile(FileName) ->
%%  code:add_path(?OUT_DIR),
  {ok,RootPath} =file:get_cwd(),
  try
    cfile(FileName, ?WORK_DIRS)
  catch
     Exception :ErrorMsg-> io:format("~p:~p",[Exception,ErrorMsg])
  after
%保证无论身么情况下,保证编译完成后,回到应用根目录
    c:cd(RootPath)
  end.

cfile(FileName, []) ->
  {erlang:atom_to_list(FileName) ++ ":not find", ?WORK_DIRS};
cfile(FileName, [Path | Left]) ->
  FileDir = Path ++ erlang:atom_to_list(FileName) ++ ".erl",
  case file:read_file_info(FileDir) of
    {ok, _} ->
%找到要编译erl文件目录,切换file server到该目录下
      c:cd(Path),
      IncludeDirs = [begin {i, Dir} end || Dir <- ?INCLUDE_DIRS],
      io:format("outdir : ~p ~n",[get_out_dir(FileName)]),
%% CompileOptions变量定义了,copile时的一些选项
%  1.{outdir, get_out_dir(FileName)} 指定文件输出目录
%  2.{parse_transform, lager_transform},编译日志输出模块
%  3.{parse_transform, lager_transform},编译生成记录操作函数
      CompileOptions = [{outdir, get_out_dir(FileName)}, {parse_transform, lager_transform},
        {parse_transform, exprecs}, report, verbose] ++ IncludeDirs,

      case compile:file(FileName, CompileOptions) of
%加载编译后的beam文件
        {ok, T} -> c:l(T), {ok, T};
        Err -> Err
      end;
    _ ->
      cfile(FileName, Left)
  end.
%%这个函数是获取runtime时,beam文件的存放的目录
get_out_dir(FileName) when is_atom(FileName) ->
  Path = code:which(FileName),
  PathBin = list_to_binary(Path),
  {Pos,_} =binary:match(PathBin,list_to_binary([atom_to_binary(FileName,utf8),<<".beam">>])),
  OutDirBin =binary:part(PathBin,0,Pos),
  binary_to_list(OutDirBin).

用法说明

1.userc.erl文件放在应用的根目录下
TIM截图20171021223027.png
2.进入linux环境,并进入应用的根目录,rebar3 shell 启动项目
3.执行:c(userc),编译该文件
4.代码调试过程中,修改了某个模块的名字,可以执行:userc:cfile(模块的名字),比如test.erl.可以这么编译:userc:cfile(test)。注意:被编译模块路径必须添加到:?WORK_DIRS宏里,否者就找不到源文件

但是如果一次性,改了多个地方,用这个反而麻烦,还是重启项目好,后期考虑,添加一个函数:usec:all/0, 就能编译指定目录的的所有文件,等测试好了,到时候再和大家分享。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • 开学提前来到这座我出生的城市,从二七下车,自己拎着大包小包,身上脚下还带着老家的泥土,站在马路中间,四周高楼大厦...
    书衷他是龙阅读 210评论 2 1
  • 为什么人总会记得某些日子,正所谓的纪念日!
    Suansuan阅读 382评论 0 0