I’ve wanted to try out Elixir for a while. The Elixir language is a functional, dynamic language runs on the Erlang VM.
Obviously this is a small post and hence we’re going to cover very little of the Elixir language here, instead we’ll cover the basics of getting things up and running.
We’re going to run up a an Elixir environment using devcontainers.
- Create yourself a .devcontainer folder within your source folder
- Create a file named devcontrainer.json with the following contents
{ "image": "elixir", "forwardPorts": [3000] }
- Open Visual Code from the folder (or open the folder in VS Code)
- You should have the option to open as a devcontainer, so do that
I’d suggest installing the ElixirLS: Elixir support and debugger or another plugin if you prefer.
Hello World
As is the usual starting point of any language, let’s create a hello_world.exs file and add the following
IO.puts("Hello World")
Now to run this open a terminal from VS Code and type.
elixir hello_world.exs
As you can see the IO.puts function outputs to the console and strings are represented by double quotes.
The Mix build tool
Mix is a little like the dotnet command (if you come from .NET) in that it can be used to create a new project, as well as different types of project. It’s used to run unit tests and ofcourse compile our application.
Let’s start by creating a new Elixir project
mix new my_project
This will create a new project named my_project along with default files such as mix.exs (using for configuring our application, dependencies etc.). We also have a test folder with an example test
defmodule ExampleTest do use ExUnit.Case doctest Example test "greets the world" do assert Example.hello() == :world end end
We can run the tests using
mix test
We can compile our Elixir application using
mix compile
this will produce a _build folder and within this we’ll see a ebin/my_project.app
Supervisor
Now, I’m going to state upfront, at this time all I know about supervisors and supervision trees is that they’re like an OS in a lightweight process. They start, work, then terminate. This is the mechanism we’ll use to create a Hello World application using mix
Run
mix new hello_world --sup
This produces a mix.exs file with the key addition
def application do [ extra_applications: [:logger], mod: {HelloWorld.Application, []} ] end
and the lib/hello_world/application.ex file looks like this. I’ve added the IO.puts line as well as removed the comments
defmodule HelloWorld.Application do @moduledoc false use Application @impl true def start(_type, _args) do children = [ ] IO.puts "Hello World" opts = [strategy: :one_for_one, name: HelloWorld.Supervisor] Supervisor.start_link(children, opts) end end
This will then run a process (using mix run) and output our “Hello World” string then terminates cleanly.
exs and ex files
You’ll notice that both .ex and .exs are used for Elixir file extensions. The basis seems to be that .ex are meant to be compiled whereas .exs are script files. It can be a little confusing as mix generated projects include both. For example for config and tests it generates .exs files, for the endpoints, router etc. they’re .ex.
References
Elixir
Mix
Using Supervisors to Organize Your Elixir Application