|
|
@@ -272,7 +272,7 @@ chkconfig(File) ->
|
|
|
end.
|
|
|
|
|
|
check_license(Config) ->
|
|
|
- ok = application:load(emqx_license),
|
|
|
+ ok = ensure_application_load(emqx_license),
|
|
|
%% This checks formal license validity to ensure
|
|
|
%% that the node can successfully start with the given license.
|
|
|
|
|
|
@@ -362,6 +362,27 @@ add_libs_dir() ->
|
|
|
add_lib_dir(RootDir, Name, Vsn) ->
|
|
|
LibDir = filename:join([RootDir, lib, atom_to_list(Name) ++ "-" ++ Vsn, ebin]),
|
|
|
case code:add_patha(LibDir) of
|
|
|
- true -> ok;
|
|
|
+ true ->
|
|
|
+ %% load all applications into application controller, before performing
|
|
|
+ %% the configuration check of HOCON
|
|
|
+ %%
|
|
|
+ %% It helps to implement the feature of dynamically searching schema.
|
|
|
+ %% See `emqx_gateway_schema:fields(gateway)`
|
|
|
+ is_emqx_application(Name) andalso ensure_application_load(Name),
|
|
|
+ ok;
|
|
|
{error, _} -> error(LibDir)
|
|
|
end.
|
|
|
+
|
|
|
+is_emqx_application(Name) when is_atom(Name) ->
|
|
|
+ is_emqx_application(atom_to_list(Name));
|
|
|
+is_emqx_application("emqx_" ++ _Rest) ->
|
|
|
+ true;
|
|
|
+is_emqx_application(_) ->
|
|
|
+ false.
|
|
|
+
|
|
|
+ensure_application_load(Name) ->
|
|
|
+ case application:load(Name) of
|
|
|
+ ok -> ok;
|
|
|
+ {error, {already_loaded, _}} -> ok;
|
|
|
+ {error, Reason} -> error({failed_to_load_application, Name, Reason})
|
|
|
+ end.
|