diff --git a/eSync.sample.config b/eSync.sample.config index 2bd8f1d..b83e8d7 100644 --- a/eSync.sample.config +++ b/eSync.sample.config @@ -11,13 +11,14 @@ %% 这个参数用于设置特殊目录下的文件检查编译与加载 %% 格式:{extraDirs, [{strategy(), [srcDirDescr()]}] | undefined} - %% -type strategy() :: add | only | del. - %% 如果 strategy() when add, 会无条件监听添加的指定目录及其子目录同步编译与加载. + %% -type strategy() :: only | del | addExtra | addOnly. + %% 如果 strategy() when addExtra, 会无条件监听添加的指定目录及其子目录同步编译与加载. + %% 如果 strategy() when addOnly, 会无条件监听添加的指定目录(不含子目录)同步编译与加载. %% 如果 strategy() when only, 仅仅监听指定目录及其子目录下的文件编译与加载. %% 如果 strategy() when del, 则不会监听该目录及其子目录下的文件. %% -type srcDirDescr() :: { Dir :: file:filename(), [Options :: compile_option()]}. %% 默认值:undefined 根据当前工作目录 和 已经加载的模块做来得出需要扫描的目录 - %%示例: {extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}. + %%示例: {extraDirs, [{addExtra, [{"./_build/default/lib/erlGbh", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}. %%{extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}, {"./_build/default/lib/eSync/ebin", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]} {extraDirs, [{strategy(), [srcDirDescr()]}]}, diff --git a/priv/fileSync b/priv/fileSync index 245d972..567f3e3 100644 Binary files a/priv/fileSync and b/priv/fileSync differ diff --git a/priv/fileSync.exe b/priv/fileSync.exe index 8f6f10b..89694c3 100644 Binary files a/priv/fileSync.exe and b/priv/fileSync.exe differ diff --git a/src/sync/esSyncSrv.erl b/src/sync/esSyncSrv.erl index c91bbf8..8aa6e09 100644 --- a/src/sync/esSyncSrv.erl +++ b/src/sync/esSyncSrv.erl @@ -197,11 +197,12 @@ handleInfo({Port, {data, Data}}, Status, #state{srcFiles = Srcs, hrlFiles = Hrls case Data of <<"init">> -> %% port启动成功 先发送监听目录配置 - {AddSrcDirs, OnlySrcDirs, DelSrcDirs} = esUtils:mergeExtraDirs(false), - AddStr = string:join([filename:nativename(OneDir) || OneDir <- AddSrcDirs], "|"), + {AddExtraSrcDirs, AddOnlySrcDirs, OnlySrcDirs, DelSrcDirs} = esUtils: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([AddStr, OnlyStr, DelStr], "\r\n"), + AllStr = string:join([AddExtraStr, AddOnlyStr, OnlyStr, DelStr], "\r\n"), erlang:port_command(Port, AllStr), esUtils:logSuccess("eSync connect fileSync success..."), %% 然后收集一下监听目录下的src文件 diff --git a/src/sync/esUtils.erl b/src/sync/esUtils.erl index e1dc6d1..29b9d52 100644 --- a/src/sync/esUtils.erl +++ b/src/sync/esUtils.erl @@ -328,12 +328,12 @@ getSrcDir(Dir, Ctr) -> mergeExtraDirs(IsAddPath) -> case ?esCfgSync:getv(?extraDirs) of undefined -> - {[], [], []}; + {[], [], [], []}; ExtraList -> FunMerge = - fun(OneExtra, {AddDirs, OnlyDirs, DelDirs} = AllAcc) -> + fun(OneExtra, {AddExtraDirs, AddOnlyDirs, OnlyDirs, DelDirs} = AllAcc) -> case OneExtra of - {add, DirsAndOpts} -> + {addExtra, DirsAndOpts} -> Adds = [ begin @@ -352,7 +352,27 @@ mergeExtraDirs(IsAddPath) -> filename:absname(Dir) end || {Dir, Opts} <- DirsAndOpts ], - setelement(1, AllAcc, Adds ++ AddDirs); + setelement(1, AllAcc, Adds ++ AddExtraDirs); + {addOnly, DirsAndOpts} -> + Adds = + [ + begin + case IsAddPath of + true -> + case proplists:get_value(outdir, Opts) of + undefined -> + true; + Path -> + ok = filelib:ensure_dir(Path), + true = code:add_pathz(Path) + end; + _ -> + ignore + end, + filename:absname(Dir) + end || {Dir, Opts} <- DirsAndOpts + ], + setelement(2, AllAcc, Adds ++ AddOnlyDirs); {only, DirsAndOpts} -> Onlys = [ @@ -372,7 +392,7 @@ mergeExtraDirs(IsAddPath) -> filename:absname(Dir) end || {Dir, Opts} <- DirsAndOpts ], - setelement(2, AllAcc, Onlys ++ OnlyDirs); + setelement(3, AllAcc, Onlys ++ OnlyDirs); {del, DirsAndOpts} -> Dels = [ @@ -380,16 +400,17 @@ mergeExtraDirs(IsAddPath) -> filename:absname(Dir) end || {Dir, _Opts} <- DirsAndOpts ], - setelement(3, AllAcc, Dels ++ DelDirs) + setelement(4, AllAcc, Dels ++ DelDirs) end end, - lists:foldl(FunMerge, {[], [], []}, ExtraList) + lists:foldl(FunMerge, {[], [], [], []}, ExtraList) end. -define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)). +-define(RegExp, <<".*\\.(erl|hrl|beam|config|dtl|lfe|ex)$">>). collSrcFiles(IsAddPath) -> - {AddSrcDirs, OnlySrcDirs, DelSrcDirs} = mergeExtraDirs(IsAddPath), - CollFiles = filelib:fold_files(filename:absname(<<"./">>), ".*\\.(erl|hrl|beam|config|dtl|lfe|ex)$", true, + {AddExtraSrcDirs, AddOnlySrcDirs, OnlySrcDirs, DelSrcDirs} = mergeExtraDirs(IsAddPath), + CollFiles = filelib:fold_files(filename:absname(<<"./">>), ?RegExp, true, fun(OneFile, {Srcs, Hrls, Configs, Beams} = Acc) -> case isOnlyDir(OnlySrcDirs, OneFile) andalso (not isDelDir(DelSrcDirs, OneFile)) of true -> @@ -431,9 +452,31 @@ collSrcFiles(IsAddPath) -> end end, {#{}, #{}, #{}, #{}}), - FunCollAdds = + FunCollAddExtra = + fun(OneDir, FilesAcc) -> + filelib:fold_files(?IIF(is_list(OneDir), list_to_binary(OneDir), OneDir), ?RegExp, true, + fun(OneFile, {Srcs, Hrls, Configs, Beams} = Acc) -> + MTimeSec = esUtils:dateTimeToSec(filelib:last_modified(OneFile)), + case filename:extension(OneFile) of + <<".beam">> -> + BeamMod = binary_to_atom(filename:basename(OneFile, <<".beam">>)), + setelement(4, Acc, Beams#{BeamMod => MTimeSec}); + <<".config">> -> + setelement(3, Acc, Configs#{OneFile => MTimeSec}); + <<".hrl">> -> + setelement(2, Acc, Hrls#{OneFile => MTimeSec}); + <<>> -> + Acc; + _ -> + setelement(1, Acc, Srcs#{OneFile => MTimeSec}) + end + end, FilesAcc) + end, + AddExtraCollFiles = lists:foldl(FunCollAddExtra, CollFiles, AddExtraSrcDirs), + + FunCollAddOnly = fun(OneDir, FilesAcc) -> - filelib:fold_files(?IIF(is_list(OneDir), list_to_binary(OneDir), OneDir), ".*\\.(erl|hrl|beam|config|dtl|lfe|ex)$", true, + filelib:fold_files(?IIF(is_list(OneDir), list_to_binary(OneDir), OneDir), ?RegExp, false, fun(OneFile, {Srcs, Hrls, Configs, Beams} = Acc) -> MTimeSec = esUtils:dateTimeToSec(filelib:last_modified(OneFile)), case filename:extension(OneFile) of @@ -451,7 +494,8 @@ collSrcFiles(IsAddPath) -> end end, FilesAcc) end, - lists:foldl(FunCollAdds, CollFiles, AddSrcDirs). + lists:foldl(FunCollAddOnly, AddExtraCollFiles, AddOnlySrcDirs). + isOnlyDir([], _) -> true;