I’m trying to integrate an alpaca module with an Elixir umbrella application.
I have no idea how to tackle this, but I think I have the various pieces of the puzzle:
- a
rebar3
project can contain a mix of erlang (.erl
) and alpaca (.alp
) files - the alpaca files can export functions in modules:
E.g, with this module in a my_module.alp
file:
module my_module
-- one function that takes a single argument will be publicly accessible:
export double/1
let double x =
let add a b = a + b in
add x x
It should export an erlang module named alpaca_my_module
, with the double/1
function
- the
rebar3
project will compile the.alp
file if it has arebar.config
file like this:
{erl_opts, [debug_info]}.
{deps, []}.
{shell, [
% {config, "config/sys.config"},
{apps, [alpatest]}
]}.
{plugins, [
{rebar_prv_alpaca, ".*", {git, "https://github.com/alpaca-lang/rebar_prv_alpaca.git", {branch, "master"}}}
]}.
{provider_hooks, [{post, [{compile, {alpaca, compile}}]}]}.
When running rebar3 compile
in an alpaca project, I manage to produce a file like ./_build/default/lib/alpatest/ebin/alpaca_my_module.beam
-
mix
seems to have built-in support for building elixir projects. I’m in an umbrella project, so I tried doing something like this:
project/
apps/
my_alpaca_app/
src/
.... . erl
my_module.alp
rebar.config
mix.exs
an_elixir_app
lib/
foo.ex
-
The
mix.exs
file for themy_alpaca
application is a default one (I have not even changed the list of compilers.) -
I want to call the
double
function in my elixir application. So themix.exs
file formy_elixir_app
mentions it as an “in_umbrella” dependency:
defp deps() do
[ { :my_alpaca_app, in_umbrella: true} ....
- When I run
mix compile
in myelixir
app, it seems like theerlang
part ofmy_alpaca
project is build ; but thealp
one is not build (thealpaca_my_module.beam
file is not created.)
So my understanding is that mix
ignores the rebar.config
file entirely.
Does it looks like a good lead ? How would I tell mix to use it ?
- The next step would be to call the
erlang / alp
function in my elixir code:
def foo() do
x = :alpaca_my_module.double(42)
...
end
Should this be the right syntax ?