Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Executables

reading/executables.livemd

Executables

Mix.install([
  {:jason, "~> 1.4"},
  {:kino, "~> 0.9", override: true},
  {:youtube, github: "brooklinjazz/youtube"},
  {:hidden_cell, github: "brooklinjazz/hidden_cell"}
])

Navigation

Home Report An Issue Games: Documentation And Static AnalysisGames: Menu

Review Questions

Upon completing this lesson, a student should be able to answer the following questions.

  • How do you configure a project as an executable script?

Executables

We can configure mix projects to run as an executable script using escript.

Once configured, we can run a mix project using an executable file inside of the project folder.

./project_name

To demonstrate how to configure an executable, We’re going to create a simple greeting executable which prints a good morning message.

Create a new mix project.

$ mix new greeting

First, we need to define a module with a main/1 function. This function will be what’s triggered by the executable. We can modify the existing Greeting module in lib/greeting.ex.

defmodule Greeting do
  def main(_args) do
    IO.puts("Good morning!")
  end
end

Remove doctests and the existing test macros to ensure all tests pass when you run mix test.

Executable Configuration

In any mix project, we can configure an executable using the :escript option in the mix.exs file. Add the :escript configuration to the existing project/0 function.

We’ve defined our main/1 function in the Greeting module, so we provide that as our :main_module.

def project do
  # make sure you keep existing configuration
  escript: [main_module: Greeting]
end

Now we have to build the executable script from the greeting folder.

$ mix escript.build

Execute the script to see the good morning message.

$ ./greeting
Good morning!

Parsing Arguments

We can provide arguments to executable scripts using --arg_name flags. A flag can be empty, or it can have a value --arg_name=true.

Elixir provides an OptionParser module to parse arguments provided to the script into Elixir terms.

OptionParser.parse(["--flag=true"], switches: [flag: :boolean])

If the :boolean type is given, flags are true by default when provided.

OptionParser.parse(["--flag=true"], switches: [flag: :boolean])

Or we can set them to false.

OptionParser.parse(["--flag=false"], switches: [flag: :boolean])

Arguments may have different types such as :boolean, :count, :integer, :float, and :string.

OptionParser.parse(["--time=hello"], switches: [time: :string])
OptionParser.parse(["--name=hello"], switches: [name: :string])

For example, we can use a --time flag to change the greeting based on the time of day.

defmodule Greeting do
  def main(args) do
    {opts, _word, _errors} = OptionParser.parse(args, switches: [time: :string])
    IO.puts("Good #{opts[:time] || "morning"}!")
  end
end

Now rebuild the script, and you can customize the message using the --time flag.

$ mix escript.build
$ ./greeting --time="evening"
Good evening!

Your Turn

Create an --upcase flag, which upcases the greeting so "Good morning! becomes GOOD MORNING!.

Commit Your Progress

DockYard Academy now recommends you use the latest Release rather than forking or cloning our repository.

Run git status to ensure there are no undesirable changes. Then run the following in your command line from the curriculum folder to commit your progress.

$ git add .
$ git commit -m "finish Executables reading"
$ git push

We’re proud to offer our open-source curriculum free of charge for anyone to learn from at their own pace.

We also offer a paid course where you can learn from an instructor alongside a cohort of your peers. We will accept applications for the June-August 2023 cohort soon.

Navigation

Home Report An Issue Games: Documentation And Static AnalysisGames: Menu