User friendly CLI apps for Elixir.
Here is a small screencast of what a generated CLI app looks like.
Add ex_cli to your list of dependencies in mix.exs:
def deps do
  [{:ex_cli, "~> 0.1.0"}]
endThe basic usage is to use ExCLI.DSL to define your CLI, and ExCLI.run to run it.
Here is a sample application:
defmodule MyApp.SampleCLI do
  use ExCLI.DSL
  name "mycli"
  description "My CLI"
  long_description ~s"""
  This is my long description
  """
  option :verbose, count: true, aliases: [:v]
  command :hello do
    aliases [:hi]
    description "Greets the user"
    long_description """
    Gives a nice a warm greeting to whoever would listen
    """
    argument :name
    option :from, help: "the sender of hello"
    run context do
      if context.verbose > 0 do
        IO.puts("Running hello command")
      end
      if from = context[:from] do
        IO.write("#{from} says: ")
      end
      IO.puts("Hello #{context.name}!")
    end
  end
end
ExCLI.run!(MyApp.SampleCLI)Which can be used in the following way.
sample_cli hello -vv world --from me
or using the command's alias:
sample_cli hi -vv world --from me
The application usage will be shown if the parsing fails. The above example would show:
usage: mycli [--verbose] <command> [<args>]
Commands
   hello   Greets the user
You can very easily generate a mix task or an escript using ExCLI
Pass escript: true to the use ExCLI.DSL and set the module as escript :main_module:
# lib/my_escript_cli.ex
defmodule MyEscriptCLI do
  use ExCLI.DSL, escript: true
end
# mix.exs
defmodule MyApp.Mixfile do
  def project do
    [app: :my_app,
     escript: [main_module: MyEscriptCLI]]
  end
endPass mix_task: TASK_NAME to the use ExCLI.DSL.
# lib/my_cli_task.ex
defmodule MyCLITask do
  use ExCLI.DSL, mix_task: :great_task
endYou can then run
mix great_task
and get nicely formatted help with
mix help great_task
Check out the documentation for more information.
- 
Command parser The command parser is now working and should be enough for a good number of tasks. 
- 
Integration with escriptandmixExCLI.DSLcan generate a module compatible withescript.buildas well as amixtask.
- 
Usage generation A nicely formatted usage is generated from the DSL. 
- 
Help command Then the goal will be to add a helpcommand which can be used asapp help commandto show help aboutcommand.
- 
Command parser improvements When the usage and help parts are done, there are a few improvements that will be nice to have in the command parser: - the ability to set a default command
- the ability to easily delegate a command to another module
- command aliases
 
- 
Man page generation When all this is done, the last part will to generate documentation in man page and markdown formats, which will probably be done as a mix task. 
Contributions are very welcome, feel free to open an issue or a PR.
I am also looking for a better name, ideas are welcome!
