Ruby Gem第10章コマンドライン実行可能ファイルの構築
2850 ワード
多くのRuby gemsは、それらの機能の一部として実行可能なコマンドラインを提供しています.命令行を離れて
これらの実行可能なファイルは、前の章で見たwebやテストのサポートライブラリと大きな違いはありません.通常、これらは独立したクラスライブラリであり、ロードのためにエントリファイルに含まれません.この章では、作成したdrawingメソッドをエージェントするために、実行可能なコマンドラインを
使用例
drawメソッドが実装されているため、実行可能なコマンドを作成するのは難しくありません.
インプリメンテーション
gemspecは、gitにコミットされ、
スクリプトがコマンドラインで実行されるため、2つの重要な変更があります.ファイルの上部に .このファイルはgemの他の部分とは独立しているため、必要な依存 をロードしなければなりません.
では、
変更を提出し、
注意:Rbenvを使用してRubyバージョンを管理する場合は、実行可能ファイルが入手できる前に
オプション解析
オプション解析をサポートしないコマンドラインはめったにありません.コマンドラインに依存する場合は、
オプションとパラメータがコマンドラインに入力されると、その機能がジオメトリレベルで強化されます.幸いなことに、Rubyにはすでに標準ライブラリに内蔵されているOptonParserクラスがあります.私は実装の詳細を他のリソースに残しましたが、これは言う価値があります.あなたの実行可能なファイルは上記のように簡単ではありませんから.
CLIクラスの抽出
コマンドラインを実行するには、プライマリ・ネーミング・スペースから1つまたは2つのメソッドではなく、より多くのコードをロードする必要があります.この場合、
現実の例
Bundlerは後者の戦略(多くのgemのやり方と同じ)を採用し、cliを実現した.rbクラスは、依存ファイルと実行可能ファイルを管理します.そこで、機能は個別のクラスに包まれ、テストが容易になります.shellスクリプトのテストは多くのRubyプログラマーが苦手なので、できるだけRuby自身に責任を譲渡します.
Resqueは別の例であり、単独のCLIクラスの例がある.実際、実行可能なファイルのコードを見てみましょう.とても簡単ですね.これは、実行可能なファイルが単純で、直接的で、すべての機能とエラー処理を独立したRubyクラスに配置することを望んでいます.
まとめ
実行可能なコマンドラインを書く構造とベストプラクティスは、本書の範囲を超えています.このテーマについてもっと良い資源がたくさんあって、それにもっと深い細部、特にDavid Bryant Copelandの本.しかし、あなたのgemに実行可能なコマンドが含まれていることがどんなに簡単なことかを理解してほしい.
次の章では、gemのユーザーに追加の柔軟な価値を提供するための構成モデルを実現します.
bunlder
かrake
を使うことができるか想像してみてください....それは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プラットフォームにいると仮定する)#!/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のユーザーに追加の柔軟な価値を提供するための構成モデルを実現します.