Takeoff

This is a microlibrary for creating Elixir applications that are fully configurable via the command-line, just as you would configure it using the standard config scripts.

Disclaimer Arguably, this might not be the Elixir way of doing things. Nevertheless, I found it usefull in deployment as well as in testing, where I sometimes would spawn lots of instances of the same service with a randomized configuration.

Example

Say we have the following simple configuration:

config :maru, MyApp.API,
  http: [port: 8080]

config :myapp, MyApp.Repo,
  adapter: Ecto.MySQL,
  database: "foobar"

After following the tutorial and building the executable, we can use something like ./myapp --http-port 9000 --db-database barbar to override these default settings.

Installation

Fist, add this microlibrary to your dependencies:

def deps do
  [{:takeoff, "~> 0.1.0"}]
end

Next, enable the generation of an executable:

def project do 
  # ...
  escript: [main_module: MyApp.CLI],
  # ...
end

We define the respective module somewhere in our source:

defmodule MyApp.CLI do
  use Takeoff,
    mod: MyApp.App, # run after configuration
    arguments: # mapping from argument prefixes to paths in Application config
      [http: [:maru, MyApp.API, :http],
      db: [:myapp, MyApp.Repo]]
end

This tells Erlang to map the prefix --db- to the configuration of our application :myapp with key MyApp.Repo, while --http- is mapped to the dependency application :maru with key MyApp.API and a sub-key :http.

The final step is to build the executable with mix escript.build. Now you will be able to run the application with ./myapp.

Future Plans

This is just a quick proof-of-concept, with nothing special added to the mix. If this were to get robust, it might be nice to provide some integration with mix itself if this is possible. Other than that, a few meta-flags could be added such as --config-file, which load configuration from the specific file or directory.

License

The MIT License.