Rebar falha ao compilar o aplicativo com badarg em is_app_available
Pergunta
Meu aplicativo erlang chamado "meuapp1"constrói bem usando vergalhão, desde que eu não inclua outro aplicativo erlang"meu_outro_app"em suas dependências (deps).Depois de adicioná-lo às minhas dependências e especificá-lo em rebar.config, sua construção falha por erro como tal:
> rebar compile
Uncaught error in rebar_core: {'EXIT',
{badarg,
[{re,run,[0.9,".*",[{capture,none}]],[]},
{rebar_deps,is_app_available,5,
[{file,"src/rebar_deps.erl"},{line,418}]},
{rebar_deps,find_dep_in_dir,3,
[{file,"src/rebar_deps.erl"},{line,380}]},
{rebar_deps,find_dep,3,
[{file,"src/rebar_deps.erl"},{line,362}]},
{rebar_deps,find_deps,4,
[{file,"src/rebar_deps.erl"},{line,345}]},
{rebar_deps,preprocess,2,
[{file,"src/rebar_deps.erl"},{line,63}]},
{rebar_core,acc_modules,5,
[{file,"src/rebar_core.erl"},{line,492}]},
{rebar_core,process_dir1,6,
[{file,"src/rebar_core.erl"},{line,195}]}]}}
O rebar.config é
%%-*- mode: erlang -*-
{deps, [
{webmachine, "1.10.*", {git, "git://github.com/basho/webmachine", "HEAD"}},
amqp_client,
rabbit_common,
my_other_app
]
}.
A estrutura da árvore é assim:
myapp1
-src/...
-ebin/...
-rebar.config
-deps/
-webmachine
-mochiweb
-my_other_app
-src/...
-ebin/...
-include/...
Na medida em que eu removo my_other_app do rebar.config, tudo funciona (exceto que o aplicativo não funciona devido ao fato de estar excluindo uma dependência necessária, mas pelo menos ele compila depois de comentar o código que usa essa dependência.
Estou tentando entender o que "is_app_available"função faz no rebar, já que meu my_other_app é de fato um aplicativo OTP, mas não é iniciado no momento em que compilo com o rebar (ele será iniciado pelo próprio myapp1 assim que alguns serviços forem iniciados.
Solução 2
Encontrei o problema...
O aplicativo de dependência tinha um Vsn (versão) em seu meu_outro_app.app.src arquivo que não era uma string (em vez disso, valor numérico).Isso causou erro no vergalhão.Certamente o vergalhão poderia ter uma mensagem de captura/erro mais amigável...
Portanto, certifique-se de verificar o {vsn, "1.1"} tag, então tem um corda em vez de decimal/numérico.
{application, my_other_app, [
{description, "my other appapplication"},
{vsn, "1.1"},
{applications, [kernel, stdlib]},
{modules, [.........etc.etc.etc......]},
{registered, [my_other_app]},
{mod,{ my_other_app, {true} } }
]}.
Outras dicas
Parece que a versão de um dos seus aplicativos pode ser um átomo, 0.9
, em vez da string, "0.9"
.O re
módulo requer um iodata()
para esse argumento.Tente descobrir qual aplicativo é esse e altere o átomo para uma string.