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.2.0"}]
endNext, enable the generation of an executable:
def project do
# ...
escript: [main_module: MyApp.CLI],
# ...
endWe 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. If this were to get more 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
loads configuration from the specific file or directory.
License
The MIT License.