niku
Can't find the module in the escript made by one `mix.exs` file at runtime
If I could build escript and run it with just one mix.exs file,
I wondered that handling tiny escript would be more easier.
So I made the following code, built and ran it.
Then it can build, but it seems that it have not found the module at runtime.
Is there a way to make it possible to find the module in the escript at runtime?
/Users/niku/sandbox% elixir -v
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir 1.4.0-rc.1
/Users/niku/sandbox% ls
mix.exs
/Users/niku/sandbox% cat mix.exs
defmodule MyApp.Mixfile do
use Mix.Project
def project do
[app: :my_app,
version: "0.0.1",
escript: escript()]
end
def escript do
[main_module: MyApp.CLI]
end
end
defmodule MyApp.CLI do
def main(_args) do
IO.puts("Hello from MyApp!")
end
end
/Users/niku/sandbox% mix escript.build
Generated my_app app
Generated escript my_app with MIX_ENV=dev
/Users/niku/sandbox% ls
_build mix.exs my_app
/Users/niku/sandbox% ./my_app
** (UndefinedFunctionError) function MyApp.CLI.main/1 is undefined (module MyApp.CLI is not available)
MyApp.CLI.main([])
(elixir) lib/kernel/cli.ex:76: anonymous fn/3 in Kernel.CLI.exec_fun/2
Marked As Solved
NobbZ
Everything in an exs is considered auxiliary and as such only compiled in memory but not to a beam file. That’s why your module isn’t found.
Also Liked
jwarlander
You would configure :elixirc_paths in mix.exs, if you really wanted to do that… so eg. to compile files in same directory as the mix.exs file instead of in lib/, you could have:
~/src/my_app$ tree
.
|-- cli.ex
`-- mix.exs
0 directories, 2 files
~/src/my_app$ cat mix.exs
defmodule MyApp.Mixfile do
use Mix.Project
def project do
[app: :my_app,
version: "0.0.1",
elixirc_paths: ["."],
escript: escript()]
end
def escript do
[main_module: MyApp.CLI]
end
end
~/src/my_app$ cat cli.ex
defmodule MyApp.CLI do
def main(_args) do
IO.puts("Hello from MyApp!")
end
end
Eiji
You should create a file:
lib/my_app/cli.ex
in your project folder and move MyApp.CLI module definition to this file.
NobbZ
Can you please point out where exactly you mean? The examples talking about *.exs scripts I am aware of, run them through elixir directly, and not build them into an escript through a mix project.
NobbZ
Oh, indeed, I think it should be made more clear here, that those need to be individual files. Thank you for pointing this out.
edit `mix`: Example for `escript.build` is misleading · Issue #11770 · elixir-lang/elixir · GitHub







