SisMaker 4 лет назад
Родитель
Сommit
1df1123bfa
11 измененных файлов: 2521 добавлений и 43 удалений
  1. +11
    -9
      README.md
  2. +2
    -2
      eSync.sample.config
  3. +1
    -2
      include/eSync.hrl
  4. +2
    -5
      rebar.config
  5. +2
    -2
      src/eSync.app.src
  6. +4
    -4
      src/eSync.erl
  7. +2
    -2
      src/eSync_app.erl
  8. +1
    -1
      src/eSync_sup.erl
  9. +13
    -13
      src/sync/esSyncSrv.erl
  10. +3
    -3
      src/sync/esUtils.erl
  11. +2480
    -0
      src/sync/es_gen_ipc.erl

+ 11
- 9
README.md Просмотреть файл

@ -1,4 +1,4 @@
# erlSync
# eSync
otp21.2+ otp21.2+
Erlang即时重新编译和重新加载! Erlang即时重新编译和重新加载!
## 基于 [fsnotify](https://github.com/fsnotify/fsnotify) 跨平台文件系统通知。 ## 基于 [fsnotify](https://github.com/fsnotify/fsnotify) 跨平台文件系统通知。
@ -7,27 +7,29 @@
# 特点 # 特点
本项目实现了自带编译与加载功能,另外支持额外的编译命令,但是执行额外的编译命令是通过os:cmd(),会阻塞VM不是很建议使用. 本项目实现了自带编译与加载功能,另外支持额外的编译命令,但是执行额外的编译命令是通过os:cmd(),会阻塞VM不是很建议使用.
启动后,erlSync会收集监听目录下的源文件和编译选项等的信息。
启动后,eSync会收集监听目录下的源文件和编译选项等的信息。
不仅适用于开发模式,也可以在生产环境中运行。 不仅适用于开发模式,也可以在生产环境中运行。
注意:linux下拉取项目后 需要给priv目录下的执行文件添加执行权限 注意:linux下拉取项目后 需要给priv目录下的执行文件添加执行权限
# 使用 # 使用
启动自动编译与加载 启动自动编译与加载
erlSync:run().
eSync:run().
暂停自动编译与加载 暂停自动编译与加载
erlSync:pause().
eSync:pause().
停止自动编译应用
eSync:stop().
启动或者关闭集群同步加载 启动或者关闭集群同步加载
erlSync:swSyncNode(TrueOrFalse).
eSync:swSyncNode(TrueOrFalse).
设置编译与加载日志提示 设置编译与加载日志提示
erlSync:setLog(Val).
eSync:setLog(Val).
设置加载后的钩子函数(支持匿名函数, {Mod, Fun}(Fun函数只有一个参数)格式, 以及他们的列表组合) 设置加载后的钩子函数(支持匿名函数, {Mod, Fun}(Fun函数只有一个参数)格式, 以及他们的列表组合)
erlSync:setOnsync(FunOrFuns).
eSync:setOnsync(FunOrFuns).
# 配置说明 # 配置说明
参见erlSync.sample.config
参见eSync.sample.config
默认配置为 默认配置为
[ [
{erlSync,
{eSync,
[ [
{listenPort, 12369}, {listenPort, 12369},
{compileCmd, undefined}, {compileCmd, undefined},

erlSync.sample.config → eSync.sample.config Просмотреть файл

@ -1,5 +1,5 @@
[ [
{erlSync, [
{eSync, [
%% 接受fileSync的监听端口 %% 接受fileSync的监听端口
{listenPort, 12369}, {listenPort, 12369},
@ -21,7 +21,7 @@
%% -type srcDirDescr() :: { Dir :: file:filename(), [Options :: compile_option()]}. %% -type srcDirDescr() :: { Dir :: file:filename(), [Options :: compile_option()]}.
%% 默认值:undefined 根据当前工作目录 和 已经加载的模块做来得出需要扫描的目录 %% 默认值:undefined 根据当前工作目录 和 已经加载的模块做来得出需要扫描的目录
%%示例: {extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}. %%示例: {extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}.
%%{extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}, {"./_build/default/lib/erlSync/ebin", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}
%%{extraDirs, [{add, [{"./_build/default/lib/erlGbh", []}, {"./_build/default/lib/eSync/ebin", []}]}, {only, [{"./", []}]}, {del, [{"./_build", []}]}]}
{extraDirs, [{strategy(), [srcDirDescr()]}]}, {extraDirs, [{strategy(), [srcDirDescr()]}]},
%% 这个参数用来设置 怎么处理 当beam文件的源文件目录不是当前工作的子目录时的情况 %% 这个参数用来设置 怎么处理 当beam文件的源文件目录不是当前工作的子目录时的情况

include/erlSync.hrl → include/eSync.hrl Просмотреть файл

@ -19,5 +19,4 @@
-define(CfgList, [{?Log, all}, {?listenPort, 12369}, {?compileCmd, undefined}, {?extraDirs, undefined}, {?descendant, fix}]). -define(CfgList, [{?Log, all}, {?listenPort, 12369}, {?compileCmd, undefined}, {?extraDirs, undefined}, {?descendant, fix}]).
-define(esCfgSync, esCfgSync). -define(esCfgSync, esCfgSync).
-define(rootSrcDir, <<"src">>).
-define(esRecompileCnt, '$esRecompileCnt').
-define(rootSrcDir, <<"src">>).

+ 2
- 5
rebar.config Просмотреть файл

@ -1,10 +1,7 @@
{erl_opts, [no_debug_info]}. {erl_opts, [no_debug_info]}.
{deps, [
{erlGbh, ".*", {git, "http://47.108.26.175:53000/SisMaker/erlGbh.git", {branch, "master"}}}
]}.
{deps, []}.
{shell, [ {shell, [
% {config, "config/sys.config"}, % {config, "config/sys.config"},
{apps, [erlSync]}
{apps, [eSync]}
]}. ]}.

src/erlSync.app.src → src/eSync.app.src Просмотреть файл

@ -1,8 +1,8 @@
{application, erlSync,
{application, eSync,
[{description, "erlang code auto compile and loader"}, [{description, "erlang code auto compile and loader"},
{vsn, "0.1.0"}, {vsn, "0.1.0"},
{registered, []}, {registered, []},
{mod, {erlSync_app, []}},
{mod, {eSync_app, []}},
{applications, [kernel, stdlib, syntax_tools, compiler]}, {applications, [kernel, stdlib, syntax_tools, compiler]},
{env, []}, {env, []},
{modules, []}, {modules, []},

src/erlSync.erl → src/eSync.erl Просмотреть файл

@ -1,4 +1,4 @@
-module(erlSync).
-module(eSync).
-export([ -export([
start/0, start/0,
@ -15,10 +15,10 @@
]). ]).
start() -> start() ->
application:ensure_all_started(erlSync).
application:ensure_all_started(eSync).
stop() -> stop() ->
application:stop(erlSync).
application:stop(eSync).
run() -> run() ->
case start() of case start() of
@ -26,7 +26,7 @@ run() ->
esSyncSrv:unpause(), esSyncSrv:unpause(),
ok; ok;
{error, Reason} -> {error, Reason} ->
Msg = io_lib:format("start erlSync error:~p~n", [Reason]),
Msg = io_lib:format("start eSync error:~p~n", [Reason]),
esUtils:logErrors(Msg) esUtils:logErrors(Msg)
end. end.

src/erlSync_app.erl → src/eSync_app.erl Просмотреть файл

@ -1,10 +1,10 @@
-module(erlSync_app).
-module(eSync_app).
-behaviour(application). -behaviour(application).
-export([start/2, stop/1]). -export([start/2, stop/1]).
start(_StartType, _StartArgs) -> start(_StartType, _StartArgs) ->
erlSync_sup:start_link().
eSync_sup:start_link().
stop(_State) -> stop(_State) ->
ok. ok.

src/erlSync_sup.erl → src/eSync_sup.erl Просмотреть файл

@ -1,4 +1,4 @@
-module(erlSync_sup).
-module(eSync_sup).
-behaviour(supervisor). -behaviour(supervisor).
-export([ -export([

+ 13
- 13
src/sync/esSyncSrv.erl Просмотреть файл

@ -1,7 +1,7 @@
-module(esSyncSrv). -module(esSyncSrv).
-behaviour(gen_ipc).
-behaviour(es_gen_ipc).
-include("erlSync.hrl").
-include("eSync.hrl").
-compile(inline). -compile(inline).
-compile({inline_size, 128}). -compile({inline_size, 128}).
@ -20,7 +20,7 @@
swSyncNode/1 swSyncNode/1
]). ]).
%% gen_ipc callbacks
%% es_gen_ipc callbacks
-export([ -export([
init/1, init/1,
handleCall/4, handleCall/4,
@ -44,21 +44,21 @@
%% ************************************ API start *************************** %% ************************************ API start ***************************
rescan() -> rescan() ->
gen_ipc:cast(?SERVER, miRescan),
es_gen_ipc:cast(?SERVER, miRescan),
esUtils:logSuccess("start rescaning source files..."), esUtils:logSuccess("start rescaning source files..."),
ok. ok.
unpause() -> unpause() ->
gen_ipc:cast(?SERVER, miUnpause),
es_gen_ipc:cast(?SERVER, miUnpause),
ok. ok.
pause() -> pause() ->
gen_ipc:cast(?SERVER, miPause),
esUtils:logSuccess("Pausing erlSync. Call erlSync:run() to restart"),
es_gen_ipc:cast(?SERVER, miPause),
esUtils:logSuccess("Pausing eSync. Call eSync:run() to restart"),
ok. ok.
curInfo() -> curInfo() ->
gen_ipc:call(?SERVER, miCurInfo).
es_gen_ipc:call(?SERVER, miCurInfo).
setLog(T) when ?LOG_ON(T) -> setLog(T) when ?LOG_ON(T) ->
esUtils:setEnv(log, T), esUtils:setEnv(log, T),
@ -75,18 +75,18 @@ getLog() ->
?esCfgSync:getv(log). ?esCfgSync:getv(log).
swSyncNode(IsSync) -> swSyncNode(IsSync) ->
gen_ipc:cast(?SERVER, {miSyncNode, IsSync}),
es_gen_ipc:cast(?SERVER, {miSyncNode, IsSync}),
ok. ok.
getOnsync() -> getOnsync() ->
gen_ipc:call(?SERVER, miGetOnsync).
es_gen_ipc:call(?SERVER, miGetOnsync).
setOnsync(Fun) -> setOnsync(Fun) ->
gen_ipc:call(?SERVER, {miSetOnsync, Fun}).
es_gen_ipc:call(?SERVER, {miSetOnsync, Fun}).
%% ************************************ API end *************************** %% ************************************ API end ***************************
start_link() -> start_link() ->
gen_ipc:start_link({local, ?SERVER}, ?MODULE, ?None, []).
es_gen_ipc:start_link({local, ?SERVER}, ?MODULE, ?None, []).
%% status :: waiting | running | pause %% status :: waiting | running | pause
init(_Args) -> init(_Args) ->
@ -200,7 +200,7 @@ handleInfo({inet_async, LSock, _Ref, Msg}, _, #state{sockMod = SockMod} = State)
DelStr = string:join([filename:nativename(OneDir) || OneDir <- DelSrcDirs], "|"), DelStr = string:join([filename:nativename(OneDir) || OneDir <- DelSrcDirs], "|"),
AllStr = string:join([AddStr, OnlyStr, DelStr], "\r\n"), AllStr = string:join([AddStr, OnlyStr, DelStr], "\r\n"),
gen_tcp:send(Sock, AllStr), gen_tcp:send(Sock, AllStr),
esUtils:logSuccess("erlSync connect fileSync success..."),
esUtils:logSuccess("eSync connect fileSync success..."),
case ?esCfgSync:getv(?compileCmd) of case ?esCfgSync:getv(?compileCmd) of
undefined -> undefined ->
%% src文件 %% src文件

+ 3
- 3
src/sync/esUtils.erl Просмотреть файл

@ -1,6 +1,6 @@
-module(esUtils). -module(esUtils).
-include("erlSync.hrl").
-include("eSync.hrl").
-compile(inline). -compile(inline).
-compile({inline_size, 128}). -compile({inline_size, 128}).
@ -434,7 +434,7 @@ isMatchDir([OneDir | ReplaceDirs], SrcDir) ->
end. end.
getEnv(Var, Default) -> getEnv(Var, Default) ->
case application:get_env(erlSync, Var) of
case application:get_env(eSync, Var) of
{ok, Value} -> {ok, Value} ->
Value; Value;
_ -> _ ->
@ -442,7 +442,7 @@ getEnv(Var, Default) ->
end. end.
setEnv(Var, Val) -> setEnv(Var, Val) ->
ok = application:set_env(erlSync, Var, Val).
ok = application:set_env(eSync, Var, Val).
logSuccess(Message) -> logSuccess(Message) ->
canLog(success) andalso error_logger:info_msg(lists:flatten(Message)). canLog(success) andalso error_logger:info_msg(lists:flatten(Message)).

+ 2480
- 0
src/sync/es_gen_ipc.erl
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


Загрузка…
Отмена
Сохранить