Working with mix project iex Code Snippets Stored in Files
iex can be used for interactively experimenting with elixir. If this experimentation becomes elaborate, it can be useful to store the commands in a file. This post covers working with files that store elixir code snippets. Attention is paid to code that depends on mix project modules.
Software Versions
$ date -u "+%Y-%m-%d %H:%M:%S +0000"
2016-03-14 17:08:09 +0000
$ uname -vm
FreeBSD 11.0-CURRENT #0 r296709: Sat Mar 12 21:18:38 JST 2016 root@mirage.sennue.com:/usr/obj/usr/src/sys/MIRAGE_KERNEL amd64
$ elixir --version
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Elixir 1.2.3
Instructions
A single line can be run from the command line.
elixir -e 'IO.puts("Hello, mix run!")' # general elixir code
mix run -e 'IO.puts("Hello, mix run!")' # project specific code
Something more elaborate probably wants to live in a file.
snippets/hello.exs
#!/usr/bin/env elixir
IO.puts "Hello, Elixir!"
The above file be run from the command line as is, but it will not have acces to modules in the mix project.
chmod +x snippets/hello.exs
./snippets/hello.exs
Run the file with mix run if any mix project modules are referenced.
mix run snippets/hello.exs
Note that c or Code.load_file can be used to load the file in iex.
c "snippets/hello.exs"
Code.load_file "snippets/hello.exs"
Code.load_file can be used to load one file from another file. This is fragile if using relative paths.
snippets/indirect.exs
#!/usr/bin/env elixir
Code.load_file "snippets/hello.exs"
To run mix code snippets directly from the command line,
add the following file to some place on your path.
For example, $(which mix)-snippet
.
mix-snippet
#!/bin/sh
mix run "$1"
Make mix-snippet executable.
chmod +x mix-snippet # use the actual path
The mix-snippet shebang can now be used.
snippets/hello-mix-snippet.exs
#!/usr/bin/env mix-snippet
IO.puts "Hello, mix-snippet!"
Code snippets that depend on the mix project can now be executed from the command line.
chmod +x snippets/mix-snippet-hello.exs
./snippets/mix-snippet-hello.exs