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
@eiji
Thank you for your ansower. You tought me a correct way.
By the way, could you let me know if you know how to include module files on the outside of lib into the escript?
@nobbz
Thank you for your ansower. I didn’t realize the extname affects to the escript.
Here is the codes for verify it.
When the extname had been renamed from .exs to .ex, mix escript.build was from failure to success.
/Users/niku/sandbox% find . -type f
./lib/my_app/cli.exs
./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
/Users/niku/sandbox% cat ./lib/my_app/cli.exs
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
** (Mix) Could not generate escript, module Elixir.MyApp.CLI defined as :main_module could not be loaded
/Users/niku/sandbox% mv ./lib/my_app/cli.exs ./lib/my_app/cli.ex
/Users/niku/sandbox% mix escript.build
Compiling 1 file (.ex)
Generated my_app app
Generated escript my_app with MIX_ENV=dev
/Users/niku/sandbox% ./my_app
Hello from MyApp!
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
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.