elixir

how generating executable in elixir


Even with all the correct imports and the mix file configured correctly, I can't generate the executable and it gives the following error:

warning: DesafioCumbuca.main/1 is undefined or private. Did you mean:

      * main/0

└─ /home/runner/work/elixir/elixir/lib/mix/lib/mix/tasks/escript.build.ex:396: :desafio_cumbuca_escript.main/1

desafio_cumbuca.ex file:

`
defmodule DesafioCumbuca do
  alias InterfaceUsuario
  alias ObterNomes
  alias EnumerarNomes
  def main() do
    InterfaceUsuario.mostrar_boas_vindas()
    nomes = ObterNomes.obter_nomes([])
    nomes_ordenados = EnumerarNomes.enumerar(nomes)
    InterfaceUsuario.mostrar_resultado(nomes_ordenados)
  end
end`

mix file:

defmodule DesafioCumbuca.MixProject do
  use Mix.Project

  def project do
    [
      app: :desafio_cumbuca,
      version: "0.1.0",
      elixir: "~> 1.17",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      escript: escript()
    ]
  end
  def escript do
    [main_module:  DesafioCumbuca]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end
end

To generate the executable file I opened the project page and typed "mix compile" and then "mix escript.build"


Solution

  • As pointed out by the error message, the arity of your main function is 0 (accepts no argument), but escript expects it to be 1 as you can see in this example.

    Replacing the following

    def main() do
    

    by

    def main(_args) do
    

    should fix it.