Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

71 рядки
2.6 KiB

10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
  1. %% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
  2. %% ex: ts=4 sw=4 et
  3. -module(rebar_plugins).
  4. -export([install/1]).
  5. -include("rebar.hrl").
  6. %% ===================================================================
  7. %% Public API
  8. %% ===================================================================
  9. install(State) ->
  10. %% Set deps_dir to a different dir for plugin so they don't collide
  11. OldDepsDir = rebar_state:get(State, deps_dir, ?DEFAULT_DEPS_DIR),
  12. State1 = rebar_state:set(State, deps_dir, ?DEFAULT_PLUGINS_DIR),
  13. DepsDir = rebar_utils:deps_dir(State1),
  14. expand_plugins(DepsDir),
  15. Plugins = rebar_state:get(State1, plugins, []),
  16. PluginProviders = rebar_utils:filtermap(fun(Plugin) ->
  17. handle_plugin(Plugin, State1)
  18. end, Plugins),
  19. State2 = rebar_state:set(State1, deps_dir, OldDepsDir),
  20. {ok, PluginProviders, State2}.
  21. handle_plugin(Plugin, State) ->
  22. try
  23. {ok, _, State1} = rebar_prv_install_deps:handle_deps(State, [Plugin]),
  24. Apps = rebar_state:all_deps(State1),
  25. ToBuild = lists:dropwhile(fun rebar_app_info:valid/1, Apps),
  26. lists:foreach(fun(AppInfo) ->
  27. AppDir = rebar_app_info:dir(AppInfo),
  28. C = rebar_config:consult(AppDir),
  29. S = rebar_state:new(rebar_state:new(), C, AppDir),
  30. rebar_prv_compile:build(S, AppInfo),
  31. true = code:add_patha(filename:join(AppDir, "ebin"))
  32. end, ToBuild),
  33. plugin_providers(Plugin)
  34. catch
  35. C:T ->
  36. ?DEBUG("~p ~p", [C, T]),
  37. ?WARN("Plugin ~p not available. It will not be used.~n", [Plugin]),
  38. false
  39. end.
  40. plugin_providers({Plugin, _, _}) when is_atom(Plugin) ->
  41. validate_plugin(Plugin);
  42. plugin_providers({Plugin, _}) when is_atom(Plugin) ->
  43. validate_plugin(Plugin);
  44. plugin_providers(Plugin) when is_atom(Plugin) ->
  45. validate_plugin(Plugin).
  46. validate_plugin(Plugin) ->
  47. Exports = sets:from_list(Plugin:module_info(exports)),
  48. Required = sets:from_list([{init,1},
  49. {do,1},
  50. {format_error,1}]),
  51. case sets:is_subset(Required, Exports) of
  52. false ->
  53. ?WARN("Plugin ~p is not a provider. It will not be used.~n", [Plugin]),
  54. false;
  55. true ->
  56. {true, Plugin}
  57. end.
  58. expand_plugins(Dir) ->
  59. Apps = filelib:wildcard(filename:join([Dir, "*", "ebin"])),
  60. ok = code:add_pathsa(Apps).