diff --git a/erlSync.sample.config b/eSync.sample.config similarity index 69% rename from erlSync.sample.config rename to eSync.sample.config index 34580b9..662a4dc 100644 --- a/erlSync.sample.config +++ b/eSync.sample.config @@ -9,6 +9,15 @@ %% 默认值: all {log, all}, + %% base dir + %% 默认值: "./" + {baseDir, "./"}, + + %% monitor file ext 监听文件的后缀名列表 + %% 默认值: [".hrl", ".erl", ".beam", ".dtl", ".lfe", ".ex", ".config"] + + {monitorExt, [".hrl", ".erl", ".beam", ".dtl", ".lfe", ".ex", ".config"]}, + %% 这个参数用于设置特殊目录下的文件检查编译与加载 %% 格式:{extraDirs, [{strategy(), [srcDirDescr()]}] | undefined} %% -type strategy() :: only | del | addExtra | addOnly. @@ -30,20 +39,22 @@ %% 默认值: fix {descendant, fix}, - %% Beam更新回调函数 格式: undefined | {Mondule, Fun} | [{Mondule, Fun}, ...], Fun函数只有一个参数 - {onMSyncFun, undefined}, + %% Beam更新回调函数 格式: undefined | {Mondule, Fun} | [{Mondule, Fun}, ...], Fun函数只有一个参数 + {onMSyncFun, undefined}, + + %% config更新回调函数 格式: undefined | {Mondule, Fun} | [{Mondule, Fun}, ...], Fun函数只有一个参数 + {onCSyncFun, undefined}, + + %% 是否开启集群同步加载 + {swSyncNode, false}, - %% config更新回调函数 格式: undefined | {Mondule, Fun} | [{Mondule, Fun}, ...], Fun函数只有一个参数 - {onCSyncFun, undefined}, + %% 仅仅内存编译还是编译写入到磁盘去 + {isJustMem, false}, - %% 是否开启集群同步加载 - {swSyncNode, false}, + %% 如果存在debug_info_key 需要用户提供获取debug_info_key的函数 格式: undefined | {Mondule, Fun} + %% this fun need return: {debug_info_key, xxx} + {debugInfoKeyFun, undefined} + ]} +]. - %% 仅仅内存编译还是编译写入到磁盘去 - {isJustMem, false}, - %% 如果存在debug_info_key 需要用户提供获取debug_info_key的函数 格式: undefined | {Mondule, Fun} - %% this fun need return: {debug_info_key, xxx} - {debugInfoKeyFun, undefined} - ]} -]. \ No newline at end of file diff --git a/priv/fileSync b/priv/fileSync index eab37de..bd5488b 100644 Binary files a/priv/fileSync and b/priv/fileSync differ diff --git a/priv/fileSync.exe b/priv/fileSync.exe index c3a7eba..6544630 100644 Binary files a/priv/fileSync.exe and b/priv/fileSync.exe differ diff --git a/src/eSync.erl b/src/eSync.erl index a19879f..24b6c2b 100644 --- a/src/eSync.erl +++ b/src/eSync.erl @@ -10,6 +10,8 @@ -define(LOG_ON(Val), Val == true; Val == all; Val == skip_success; is_list(Val), Val =/= []). -define(Log, log). +-define(baseDir, baseDir). +-define(monitorExt, monitorExt). -define(compileCmd, compileCmd). -define(extraDirs, extraDirs). -define(descendant, descendant). @@ -19,7 +21,9 @@ -define(isJustMem, isJustMem). -define(debugInfoKeyFun, debugInfoKeyFun). --define(DefCfgList, [{?Log, all}, {?compileCmd, undefined}, {?extraDirs, undefined}, {?descendant, fix}, {?onMSyncFun, undefined}, {?onCSyncFun, undefined}, {?swSyncNode, false}, {?isJustMem, false}, {?debugInfoKeyFun, undefined}]). +-define(ExtList, [".hrl", ".erl", ".beam", ".dtl", ".lfe", ".ex", ".config"]). + +-define(DefCfgList, [{?Log, all}, {?baseDir, "./"}, {?monitorExt, ?ExtList}, {?compileCmd, undefined}, {?extraDirs, undefined}, {?descendant, fix}, {?onMSyncFun, undefined}, {?onCSyncFun, undefined}, {?swSyncNode, false}, {?isJustMem, false}, {?debugInfoKeyFun, undefined}]). -define(esCfgSync, esCfgSync). -define(rootSrcDir, <<"src">>). @@ -225,17 +229,9 @@ handle_info({Port, {data, Data}}, #state{status = Status, srcFiles = Srcs, hrlFi wait -> case Data of <<"init">> -> - %% port启动成功 先发送监听目录配置 - {AddExtraSrcDirs, AddOnlySrcDirs, OnlySrcDirs, DelSrcDirs} = mergeExtraDirs(false), - AddExtraStr = string:join([filename:nativename(OneDir) || OneDir <- AddExtraSrcDirs], "|"), - AddOnlyStr = string:join([filename:nativename(OneDir) || OneDir <- AddOnlySrcDirs], "|"), - OnlyStr = string:join([filename:nativename(OneDir) || OneDir <- OnlySrcDirs], "|"), - DelStr = string:join([filename:nativename(OneDir) || OneDir <- DelSrcDirs], "|"), - AllStr = string:join([AddExtraStr, AddOnlyStr, OnlyStr, DelStr], "\r\n"), - erlang:port_command(Port, AllStr), - ?logSuccess("eSync connect fileSync success..."), %% 然后收集一下监听目录下的src文件 {BSrcs, BHrls, BConfigs, BBeams} = collSrcFiles(true), + ?logSuccess("eSync connect fileSync success and coll src files over..."), {noreply, State#state{status = running, srcFiles = BSrcs, hrlFiles = BHrls, configs = BConfigs, beams = BBeams}, hibernate}; _ -> ?logErrors("error, eSync receive unexpect port msg ~p~n", [Data]), @@ -255,8 +251,19 @@ handle_info({'EXIT', _Pid, _Reason}, _State) -> {noreply, _State}; handle_info(doAfter, State) -> %% 启动port 发送监听目录信息 + {AddExtraSrcDirs, AddOnlySrcDirs, OnlySrcDirs, DelSrcDirs} = mergeExtraDirs(false), + AddExtraStr = string:join([filename:nativename(OneDir) || OneDir <- AddExtraSrcDirs], "|"), + AddOnlyStr = string:join([filename:nativename(OneDir) || OneDir <- AddOnlySrcDirs], "|"), + OnlyStr = string:join([filename:nativename(OneDir) || OneDir <- OnlySrcDirs], "|"), + DelStr = string:join([filename:nativename(OneDir) || OneDir <- DelSrcDirs], "|"), + AllStr = string:join([AddExtraStr, AddOnlyStr, OnlyStr, DelStr], "\r\n"), + + BaseDirStr = filename:nativename(?esCfgSync:getv(?baseDir)), + MonitorExtStr = string:join(?esCfgSync:getv(?monitorExt), "|"), + + Opts = [{packet, 4}, binary, exit_status, use_stdio, {args, [BaseDirStr, MonitorExtStr, AllStr]}], + PortName = fileSyncPath("fileSync"), - Opts = [{packet, 4}, binary, exit_status, use_stdio], Port = erlang:open_port({spawn_executable, PortName}, Opts), {noreply, State#state{port = Port}, 4000}; handle_info(timeout, State) -> @@ -352,7 +359,7 @@ tryGetModOpts(Module) -> Options7 = lists:keyreplace(debug_info_key, 1, Options6, debugInfoKeyFun()), {ok, Options7} catch _ExType:_Error -> - undefiend + undefined end. tryGetSrcOpts(SrcDir) -> @@ -563,11 +570,7 @@ getSrcDir(Dir) -> getSrcDir(_Dir, 0) -> undefined; getSrcDir(Dir, Ctr) -> - HasCode = filelib:wildcard("*.erl", Dir) /= [] orelse - filelib:wildcard("*.hrl", Dir) /= [] orelse - filelib:wildcard("*.dtl", Dir) /= [] orelse - filelib:wildcard("*.lfe", Dir) /= [] orelse - filelib:wildcard("*.ex", Dir) /= [], + HasCode = filelib:wildcard("*.{erl,hrl,ex,dtl,lfe}", Dir) /= [], if HasCode -> {ok, Dir}; true -> getSrcDir(filename:dirname(Dir), Ctr - 1) @@ -654,10 +657,18 @@ mergeExtraDirs(IsAddPath) -> lists:foldl(FunMerge, {[], [], [], []}, ExtraList) end. --define(RegExp, <<".*\\.(erl|hrl|beam|config|dtl|lfe|ex)$">>). +toBinary(Value) when is_list(Value) -> list_to_binary(Value); +toBinary(Value) when is_binary(Value) -> Value. + +regExp() -> + % <<".*\\.(erl|hrl|beam|config|dtl|lfe|ex)$">> + <<_Del:8, RegExpStr/binary>> = << <<"|", (toBinary(Tail))/binary>> || [_Dot | Tail] <- ?esCfgSync:getv(?monitorExt)>>, + <<".*\\.(", RegExpStr/binary, ")$">>. + +-define(RegExp, regExp()). collSrcFiles(IsAddPath) -> {AddExtraSrcDirs, AddOnlySrcDirs, OnlySrcDirs, DelSrcDirs} = mergeExtraDirs(IsAddPath), - CollFiles = filelib:fold_files(filename:absname(<<"./">>), ?RegExp, true, + CollFiles = filelib:fold_files(filename:absname(toBinary(?esCfgSync:getv(?baseDir))), ?RegExp, true, fun(OneFile, {Srcs, Hrls, Configs, Beams} = Acc) -> case isOnlyDir(OnlySrcDirs, OneFile) andalso (not isDelDir(DelSrcDirs, OneFile)) of true ->