diff --git a/eSync.sample.config b/eSync.sample.config index b83e8d7..662a4dc 100644 --- a/eSync.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. 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 9b3056d..76df125 100644 --- a/src/eSync.erl +++ b/src/eSync.erl @@ -11,6 +11,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). @@ -20,7 +22,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">>). @@ -160,8 +164,18 @@ init(_Args) -> handleAfter(?None, waiting, 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), {kpS, State#state{port = Port}, {sTimeout, 4000, waitConnOver}}. @@ -195,7 +209,7 @@ handleCast(miRescan, _, State) -> handleCast(_Msg, _, _State) -> kpS_S. -handleInfo({Port, {data, Data}}, Status, #state{srcFiles = Srcs, hrlFiles = Hrls, configs = Configs, beams = Beams, onMSyncFun = OnMSyncFun, onCSyncFun = OnCSyncFun, swSyncNode = SwSyncNode} = State) -> +handleInfo({_Port, {data, Data}}, Status, #state{srcFiles = Srcs, hrlFiles = Hrls, configs = Configs, beams = Beams, onMSyncFun = OnMSyncFun, onCSyncFun = OnCSyncFun, swSyncNode = SwSyncNode} = State) -> case Status of running -> FileList = binary:split(Data, <<"\r\n">>, [global]), @@ -230,18 +244,9 @@ handleInfo({Port, {data, Data}}, Status, #state{srcFiles = Srcs, hrlFiles = Hrls _ -> 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 coll src files over..."), + ?logSuccess("eSync connect fileSync success and coll src files over..."), {nextS, running, State#state{srcFiles = BSrcs, hrlFiles = BHrls, configs = BConfigs, beams = BBeams}, {isHib, true}}; _ -> ?logErrors("error, receive unexpect port msg ~p~n", [Data]), @@ -353,7 +358,7 @@ tryGetModOpts(Module) -> Options7 = lists:keyreplace(debug_info_key, 1, Options6, debugInfoKeyFun()), {ok, Options7} catch _ExType:_Error -> - undefiend + undefined end. tryGetSrcOpts(SrcDir) -> @@ -564,11 +569,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) @@ -655,10 +656,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 ->