Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでコマンドラインアプリケーション(CLI)を作る方法を徹底解説

RubyはWebアプリケーション開発のイメージが強く、それ以外の用途があることを忘れられがちです。そこで本記事では、Rubyを使ってコマンドラインアプリケーション(CLI)を構築する方法を詳しく解説します。

まず、皆さんがよく目にするコマンドラインアプリケーションの例を挙げてみましょう。

  • psql(PostgreSQLの対話型ターミナル)
  • rails
  • bundler
  • gem
  • git

CLIアプリケーションの作り方はさまざまですが、この記事では代表的な3つの方法に焦点を当てて紹介します。

この記事で学べること

  • ARGV配列の使い方
  • OptParseライブラリの使い方
  • Thor gemの使い方

それでは、始めましょう!

Rubyの定数「ARGV」とは?

コマンドラインアプリケーションは、通常、複数のオプションや「フラグ」を受け取ります。

例:

psql --help

では、Rubyからこれらのオプションにはどうやってアクセスすればよいのでしょうか?

答えはARGV配列です。

argv.rbというファイルに以下のコードを書いたとします。

p ARGV

このコードを ruby argv.rb test abc 1 2 3 のように実行すると、次の出力が得られます。

["test", "abc", "1", "2", "3"]

ご覧のとおり、渡されたすべてのオプションが配列として格納されています。

特定のオプションが渡されたかどうかを判定したい場合は、独自のオプションパーサーを実装できます。

実装例はこちら:

def process_argv(option)
  case option
  when "-h"
    puts "This is the help menu."
    puts "  -v Enable verbose mode"
    puts "  -c Enable syntax highlighting"
    exit
  when "-v"
    @options[:verbose] = true
  when "-c"
    @options[:syntax_highlighting] = true
  end
end

@options = {}

ARGV.each { |option| process_argv(option) }

p @options

次のように実行すると:

ruby argv.rb -v -c

次のような結果になります:

{:verbose=>true, :syntax_highlighting=>true}

シンプルな処理であればこれで十分ですが、より大きなアプリケーションを作りたい場合は、他のソリューションを検討したほうがよいでしょう。

OptionParserライブラリの使い方

Rubyには標準でOptionParserクラスが用意されており、これを使えばコマンドラインオプションを簡単に解析できます。

使用例を見てみましょう:

require 'optparse'

@options = {}

OptionParser.new do |opts|
  opts.on("-v", "--verbose", "Show extra information") do
    @options[:verbose] = true
  end

  opts.on("-c", "--color", "Enable syntax highlighting") do
    @options[:syntax_highlighting] = true
  end
end.parse!

p @options

自前の実装と比べて、optparseを使うことには多くのメリットがあります。

主なメリット:

  • 短い形式 -v と長い形式 --verbose を、追加の手間なく両方定義できる
  • 各オプションに説明文を持たせることができ、ヘルプメニューに自動的に反映される
  • ヘルプメニューが自動生成されるため、オプションの追加・削除のたびに手動で更新する必要がない

実際のヘルプメニューはこんな感じです:

Rubyでコマンドラインアプリケーション(CLI)を作る方法を徹底解説

何より嬉しいのは、すべてRubyに組み込まれている機能なので、追加インストールが一切不要という点です!

Thor gemの使い方

別のアプローチでオプション解析を行いたいなら、Thor gemをチェックしてみましょう。Railsも内部でThorを使用しています。

Railsでは、次のようなサブコマンドを使いますよね:

  • rails new
  • rails generate
  • rails console

このrailsコマンドを(部分的にでも)再現するには、次のように書きます。

require 'thor'

class RailsCLI < Thor
  class_option :verbose, :type => :boolean, :aliases => "-v"

  desc "new DIRECTORY", "Create a new rails app"

  def new
    # ...
  end

  desc "generate THING PARAMETERS", "Generate controller / model / migration"

  def generate
    # ...
  end

  desc "console", "Start a rails console"

  def console
    # ...
  end
end

RailsCLI.start(ARGV)

ヘルプメニューはこのように表示されます:

Rubyでコマンドラインアプリケーション(CLI)を作る方法を徹底解説

これはOptionParserとはかなりスタイルの異なるアプローチです。

そのため、アプリが「1つの処理を少数の可変オプションで実行する」だけのものであれば、Thorは最適な選択ではないかもしれません。

しかし、railsのように多くの異なるタスクを担うコマンドを作る場合には、Thorは非常に優れた選択肢となります!

Readlineライブラリで対話型インターフェースを作る

prypsqlのような、対話型インターフェースを持つアプリケーションを作ってみたいと思いませんか?

そんなときに活躍するのがReadlineモジュールです。

以下はその使用例です:

prompt = "> "

while buf = Readline.readline(prompt, true)
  puts "Your input was: '#{buf}'"
end

このコードを実行するとプロンプトが表示され、Enterキーを押すと入力した内容がそのままエコーバックされます。

プログラムを終了するには CTRL+C を押します。

Readlineは入力履歴を自動的に保持してくれるのが便利なポイントです。ctrl+rで履歴検索ができるほか、コード内からは Readline::HISTORY.to_a で履歴を取得できます。

さらにReadlineを使えば、自動補完(オートコンプリート)などの機能も実装可能です。詳細は公式ドキュメントのサンプルを参照してみてください。

動画チュートリアルを見る

まとめ

普段GUI中心の方でも、コマンドラインアプリケーションは非常に強力で、開発していて楽しい分野です。

ぜひこの記事を参考に、今日からあなただけのCLIツールづくりを始めてみてください 🙂


  1. Rubyでパーサーを自作する方法!StringScannerを使った実装手順を徹底解説

    パース(構文解析)とは、文字列の集まりから意味を読み取り、プログラムが扱える形のデータへと変換する技術です。正規表現でも文字列の解析は可能ですが、すべての場面に適しているわけではありません。 たとえば、正規表現でHTMLを解析するのはあまり良い方法ではないというのは、プログラミング界隈ではよく知られた話です。 Rubyにはnokogiriという強力なライブラリがあり、HTMLの解析はこれに任せられます。しかし、自分でパーサーを一から作ってみると、文字列処理や構文解析の仕組みについて多くのことを学べます。それでは早速始めていきましょう! Rubyでのパースの基本:StringScannerクラス

  2. SwiftUIでデザインシステムを構築する方法:実践ガイドとベストプラクティス

    1つのプロダクトを支えるデザインシステムを構築することは決して簡単ではありません。スケーラビリティを確保しながら、堅牢性と柔軟性の両方を兼ね備える必要があるからです。難しい課題ではありますが、これまで多くの優れたリソースが、ビジュアル面とプログラム面の両方で良いシステムを構築するための有用な原則やアプローチを共有してきました。それらの知見の上に立ち、本記事ではまだあまり語られていない領域であるSwiftUIでのデザインシステム構築に焦点を当てて解説します。なぜこの記事を書いたのかニューヨークのITP(Interactive Telecommunications Program)での最初の夏、私