私のRuby GEMコマンドラインサービスをどのように構造化するべきですか?
-
10-12-2019 - |
質問
私は、ユーザーがインストールしてコマンドラインルビーツールを使用してサービスと対話できるRuby Gemを書いています。サービスを開始して停止することができます(子プロセスから生成されます)。
ØMQ/ EventMachineなどのネットワークサービスを書くために使用する最善のことを多くの研究をしました。しかし、私は良いコード構造を選択するのに苦労しています。
My Command Lineユーティリティはさまざまな引数を取ります( trollop )とそれを使用します。物事をやるためのクラス、そして他のさまざまなRuby Gemsを使用してください。
クラスファイルを置く場所と私のバイナリにそれらを必要とする方法はよくわかりませんので、パスは正しいです。
解決
主に、Rubygemsはあなたのためにこれを大事にします。 files
リストに実行可能ファイルを含める必要があり、GEMSpecのexecutables
に入れる必要があります。実行可能ファイルをあなたのディレクトリにbin
に入れるのは一般的です。:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
.
あなたのGEMSpecは次のようになります:
Gem::Specification.new do |s|
s.name = 'myapp'
# whatever else is in your gemspec
s.files = ["bin/myapp","lib/myapp.rb"] # or whatever other files you want
s.executables = ["bin/todo"]
end
.
この時点で、RubyGemsを介してアプリをインストールすると、myapp
がパスにあり、lib
はアプリのロードパスにあります。
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
.
唯一の問題は、開発中に、bin/myapp
を実行してアプリを実行することはできません。一部のDEVは、$:
または$LOAD_PATH
を介してロードパスを操作しますが、これは不良形式と見なされます。
Bundlerを使用している場合は、bundle exec
でローカルにアプリを実行するのが最も簡単です。 bundle exec bin/myapp
。 ARUBYLIB
環境変数を交互に使用することができます。 RUBYLIB=lib bin/myapp
。
他のヒント
すべての宝石は自然によって開かれているので、常に例としてより良いもののいくつかを見てもらうことができます。jeweler
またはhoe
のようなGEMビルダーを使用すると、組織的には基本的な構造のいくつかを設定します。