Use correct erlang include paths for rebar3 projects
Add a few more include paths for erlang projects built using rebar 3. This allows syntastic to pick up dependencies and resolve include paths in multiple-app rebar3 projects (assuming that the default `apps` parent directory is used). Existing erlang projects should be unaffected. It's possible that this could be done slightly more elegantly by shelling out to the new `rebar3 path` command, but this is quite slow in our setup and may not be configured correctly in editing environments.
This commit is contained in:
parent
96cc251075
commit
4b93dffbd9
@ -69,6 +69,7 @@ rebar_opts(RebarFile) ->
|
|||||||
Dir = get_root(filename:dirname(RebarFile)),
|
Dir = get_root(filename:dirname(RebarFile)),
|
||||||
case file:consult(RebarFile) of
|
case file:consult(RebarFile) of
|
||||||
{ok, Terms} ->
|
{ok, Terms} ->
|
||||||
|
%% Add deps for a rebar (version < 3) project
|
||||||
RebarLibDirs = proplists:get_value(lib_dirs, Terms, []),
|
RebarLibDirs = proplists:get_value(lib_dirs, Terms, []),
|
||||||
lists:foreach(
|
lists:foreach(
|
||||||
fun(LibDir) ->
|
fun(LibDir) ->
|
||||||
@ -76,8 +77,14 @@ rebar_opts(RebarFile) ->
|
|||||||
end, RebarLibDirs),
|
end, RebarLibDirs),
|
||||||
RebarDepsDir = proplists:get_value(deps_dir, Terms, "deps"),
|
RebarDepsDir = proplists:get_value(deps_dir, Terms, "deps"),
|
||||||
code:add_pathsa(filelib:wildcard(RebarDepsDir ++ "/*/ebin")),
|
code:add_pathsa(filelib:wildcard(RebarDepsDir ++ "/*/ebin")),
|
||||||
IncludeDeps = {i, filename:join(Dir, RebarDepsDir)},
|
|
||||||
proplists:get_value(erl_opts, Terms, []) ++ [IncludeDeps];
|
%% Add deps for rebar 3
|
||||||
|
code:add_pathsa(filelib:wildcard(Dir ++ "/_build/default/lib/*/ebin")),
|
||||||
|
%% Add include dependencies
|
||||||
|
IncludeDeps = [{i, IPath} || IPath <- filelib:wildcard(Dir ++ "/_build/default/lib/*")] ++
|
||||||
|
[{i, filename:join(Dir, RebarDepsDir)}, %% rebar 2 dependencies
|
||||||
|
{i, filename:join(Dir, "apps")}], %% rebar 3 multi-apps
|
||||||
|
proplists:get_value(erl_opts, Terms, []) ++ IncludeDeps;
|
||||||
{error, _} when RebarFile == "rebar.config" ->
|
{error, _} when RebarFile == "rebar.config" ->
|
||||||
fallback_opts();
|
fallback_opts();
|
||||||
{error, _} ->
|
{error, _} ->
|
||||||
@ -258,12 +265,19 @@ apps_dir_from_src(SrcFile) ->
|
|||||||
SrcDir = filename:dirname(SrcFile),
|
SrcDir = filename:dirname(SrcFile),
|
||||||
filename:join(SrcDir, "../../ebin").
|
filename:join(SrcDir, "../../ebin").
|
||||||
|
|
||||||
|
%% Find the root directory of the project
|
||||||
get_root(Dir) ->
|
get_root(Dir) ->
|
||||||
Path = filename:split(filename:absname(Dir)),
|
Path = filename:split(filename:absname(Dir)),
|
||||||
filename:join(get_root(lists:reverse(Path), Path)).
|
filename:join(get_root(lists:reverse(Path), Path)).
|
||||||
|
|
||||||
get_root([], Path) ->
|
get_root([], Path) ->
|
||||||
Path;
|
Path;
|
||||||
|
%% Strip off /apps/<appname>/src from the end of the path
|
||||||
|
%% (rebar 3 multi-app project)
|
||||||
|
get_root(["src", _Appname, "apps" | Tail], _Path) ->
|
||||||
|
lists:reverse(Tail);
|
||||||
|
%% Strip off /src or /test from the end of the path
|
||||||
|
%% (single-app project)
|
||||||
get_root(["src" | Tail], _Path) ->
|
get_root(["src" | Tail], _Path) ->
|
||||||
lists:reverse(Tail);
|
lists:reverse(Tail);
|
||||||
get_root(["test" | Tail], _Path) ->
|
get_root(["test" | Tail], _Path) ->
|
||||||
|
Loading…
Reference in New Issue
Block a user