This is a tutorial on using Ruby and Commander to build a command line interface (CLI) app.


Create the project directory and add a Gemfile.

mkdir ruby-cli
cd ruby-cli
touch Gemfile

The Gemfile has only 1 gem - commander:

source ""
gem "commander"

Install with bundle install. If you don’t have bundler, then install with gem install bundler first.

The Code

This is the code for our simple ruby-cli.rb:

#!/usr/bin/env ruby

require 'rubygems'
require "bundler/setup"
require 'commander/import'

program :name, "Ruby CLI"
program :version, '1.0.0'
program :description, 'A simple cli that does nothing'

command :extract do |c|
		c.syntax = 'ruby-cli extract foo -bar=123'
		c.description = 'Extract foo and bar'
		c.option '--bar STRING', String, 'Option bar with a string'
		c.action do |args, options|
				options.default :bar => 'BAR'
				puts 'Extracting..'
				puts "Args: #{args}"
				puts "Option Bar: #{}"

We can now run ruby ruby-cli.rb extract. But we can simply run ./ruby-cli.rb extract, since the first line declared the ruby shebang. All we need is to chmod a+x ruby-cli.rb so that the file has executable permission.

Using commander, we have described our CLI easily. Run ./ruby-cli.rb --help, and it will provide a nice help on all the commands that is possible. In our code, we only have extract command.

In our extract command, we print out the args and options.

There is only 1 option --bar, with the default string “BAR”.

Ruby Gem

Till now, you can ruby ./ruby-cli.rb ....

But we could install it as a gem, and run ruby-cli ....

To do that, move the script to bin, and without the extension

mkdir bin
mv ruby-cli.rb bin/ruby-cli

Next we create the file ruby-cli.gemspec. do |s| = 'ruby-cli'
  s.version = '1.0.0' = '2015-12-25'
  s.summary = "Our simple CLI"
  s.description = "Our very very simple CLI"
  s.authors = [ "Luke Skywalker" ] = '[email protected]'
  s.executables << 'ruby-cli'

  s.add_dependency 'commander'

To build the gem:

gem build ruby-cli.gemset

To install the gem:

gem install ruby-cli-1.0.0.gem

Finally, you can run ruby-cli extract foo -bar=1213!

PS: This is my first tutorial with using Ruby. I have been fighting against using Ruby for many times, since languages like Python and Go are great, and I am sure Swift will be usable for scripting some day too. But, so many existing tools use Ruby, that I can’t avoid it. Two of my favorites - Jekyll and fastlane.




Back to Home