Ruby Gem第10章コマンドライン実行可能ファイルの構築

2850 ワード

多くのRuby gemsは、それらの機能の一部として実行可能なコマンドラインを提供しています.命令行を離れてbunlderrakeを使うことができるか想像してみてください....それはgemではありません!
これらの実行可能なファイルは、前の章で見たwebやテストのサポートライブラリと大きな違いはありません.通常、これらは独立したクラスライブラリであり、ロードのためにエントリファイルに含まれません.この章では、作成したdrawingメソッドをエージェントするために、実行可能なコマンドラインをmega_lotoo gemに統合します.
使用例mega_lottoメソッドの#drawをエージェントするためにMegaLotto::Drawingのコマンドラインツールを作成し、このようなものを返します.
$ mega_lotto
1
6
47
57 
15 
26

drawメソッドが実装されているため、実行可能なコマンドを作成するのは難しくありません.
インプリメンテーションbin/ディレクトリは、実行可能なファイルの標準的な場所です.mega_lotto.gemspecをもう一度見てみましょう.次の行に注意してください.
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }

gemspecは、gitにコミットされ、bin/ディレクトリの下に位置することによって実行可能なファイルのリストを定義する.ファイルbin/mega_lottoに追加しましょう
スクリプトがコマンドラインで実行されるため、2つの重要な変更があります.
  • ファイルの上部に#!/usr/bin/envを追加し、コマンドchomd +x bin/mega_lottoを使用して実行を許可する(linuxまたはmacOSプラットフォームにいると仮定する)
  • .
  • このファイルはgemの他の部分とは独立しているため、必要な依存
  • をロードしなければなりません.
    #!/usr/bin/env ruby
    require_relative "../lib/mega_lotto/drawing"
    

    では、#drawメソッドをエージェントします.
    #!/usr/bin/env ruby
    require_relative "../lib/mega_lotto/drawing"
    drawing = MegaLotto::Drawing.new.draw 
    puts drawing
    

    変更を提出し、rake installを実行しましょう.
    $ mega_lotto
    8
    11
    9
    38
    43
    

    注意:Rbenvを使用してRubyバージョンを管理する場合は、実行可能ファイルが入手できる前にrbenv rehashを実行する必要があります.
    オプション解析
    オプション解析をサポートしないコマンドラインはめったにありません.コマンドラインに依存する場合は、-hはよく使用するオプションです.私たちが日常的に使用している実行可能なファイルのオプションを覚えている人は少ないからです.
    オプションとパラメータがコマンドラインに入力されると、その機能がジオメトリレベルで強化されます.幸いなことに、Rubyにはすでに標準ライブラリに内蔵されているOptonParserクラスがあります.私は実装の詳細を他のリソースに残しましたが、これは言う価値があります.あなたの実行可能なファイルは上記のように簡単ではありませんから.
    CLIクラスの抽出
    コマンドラインを実行するには、プライマリ・ネーミング・スペースから1つまたは2つのメソッドではなく、より多くのコードをロードする必要があります.この場合、lib/mega_lotto/cli.rbのように、通常は個別のファイルに区切る必要があります.したがって、実行可能ファイルにrequire_relative "../lib/mega_lotto/drawing"をロードするのではなく、require_relative "../lib/mega_lotto/cli"を含む.実行可能コマンドでは、lib/mega_lotto/cli.rbファイルを追加して依存をロードし、lib/mega_lotto/cli.rbファイルがあればオプションを解析することができます.
    現実の例
    Bundlerは後者の戦略(多くのgemのやり方と同じ)を採用し、cliを実現した.rbクラスは、依存ファイルと実行可能ファイルを管理します.そこで、機能は個別のクラスに包まれ、テストが容易になります.shellスクリプトのテストは多くのRubyプログラマーが苦手なので、できるだけRuby自身に責任を譲渡します.
    Resqueは別の例であり、単独のCLIクラスの例がある.実際、実行可能なファイルのコードを見てみましょう.とても簡単ですね.これは、実行可能なファイルが単純で、直接的で、すべての機能とエラー処理を独立したRubyクラスに配置することを望んでいます.
    まとめ
    実行可能なコマンドラインを書く構造とベストプラクティスは、本書の範囲を超えています.このテーマについてもっと良い資源がたくさんあって、それにもっと深い細部、特にDavid Bryant Copelandの本.しかし、あなたのgemに実行可能なコマンドが含まれていることがどんなに簡単なことかを理解してほしい.
    次の章では、gemのユーザーに追加の柔軟な価値を提供するための構成モデルを実現します.