2016-11-04 13 views
0

私の問題は、必要なファイルがオプションパーサーをインターセプトすることです。それ自身のオプションパーサーを持つプログラムでもあるファイルを要求する

私は、特定のサイトへの接続を処理する1つのファイル(connect.rb)と、データを収集する最初の2つ(populate.rbとupdate.rb)の3つのファイルでRubyプログラムを作成しています。そのサイト。

connect.rbのような、接続を設定し、テストするために実行することができます。一方

$ruby connect.rb --adduser myuser -p 1234 --test 
Created user myuser 
Connecting as myuser... 
Connection test OK 

、populate.rbは「必要connect.rb」行を持っているが、それはまたすることができそれは独自のオプションがあります。

以前はconnect.rbにオプションがありませんでしたが、それはうまくいきましたが、optparseでconnect.rbにオプションを追加したので、populate.rbとupdate.rbのオプションパーサはもう動作しません。 'ruby populate.rb -h'を実行すると、populate.rbのものではなく、connect.rbで使用できるオプションが表示されます。 connect.rbが受け入れるオプション、例えば '-t'のようなオプションを使うと、connect.rbと同じようにオプションが実行されます。 connect.rbが受け入れないオプションを使用しても、populate.rbは "無効なオプション"エラーを表示して終了する必要があります。

基本的に、別のファイルに必要なときにsoloを実行すると、connect.rbの動作が異なるようにします。私はそれを単独で実行するとき、私はそれがオプションを受け入れて何かをしたいと思う。それが別のファイルで必要とされるときには、私はメソッドを利用できるようにしたいのですが、別のオプションが必要です。

これは可能ですか?オプションの傍受を防ぐために、それがどのように呼び出されたか、あるいは他の方法であるかを示す方法はありますか?すべてのファイルでoptparseを使用しています。

答えて

0

私はこれと似たような解決方法は、ファイルは、このようなソロを実行されているかどうかを確認することです。最後の条件$0

# connect.rb  

# wrap logic in a module 
module Connect 
    def self.run(args: ARGV) 
    args # access to command line options 
    end 
end 

# run if solo 
Connect.run if $0 == __FILE__ 

は、Rubyのグローバルセットで実行されるファイルの名前にし、 __FILE__は、現在のファイルの名前です。両方が同じ場合は、ファイルが単独で実行されていることがわかります。つまり、ruby connect.rbです。

この設定では、connect.rbのソロを実行すると問題なく動作します。その後、あなたは他のファイルpopulate.rbあなたが明示的にそれを実行する必要があり、それを必要とする場合:

# popoulate.rb 
require 'connect' 
Connect.run ARGV.dup # dup the commandline options in case other files mutate them 

希望に役立ちます。

+0

あなたの答えをありがとう!私は最後の行が何をしているのか分からない。とにかく引数を渡してモジュールを実行しますか?この行を追加しないとどうなりますか? – mozsalles

+0

この行は? 'Connect.run ARGV.dup'はいそれはコマンドラインオプションで渡すモジュールを実行します。この行を追加しないと、populate.rbが必要な場合には接続モジュールは実行されません – DiegoSalazar

0

私が質問を書いている間、私は1つの答えを知っていました!

のオプションが解析された後、基本的に 'require connect.rb'行をに移動します。だから私のpopulate.rbはこのようになりました:

require "optparse" 
Version = 1.4 

# Parses command line arguments 
options = {} 
optparse = OptionParser.new do |opts| 
    # populate the options array according to the options 
    ... 
end 

optparse.parse! 

require "./connect_fb" 

# start actual program 
... 

私は、アレイ内のオプションを格納することで、コードの大部分からの解析オプションを分離するので、とconnect.rbは何もする必要はありませんので、これは動作しますオプションなしで呼び出された場合私は実際に最初に呼ばれたオプションパーサがなぜ機能するのか理解できません。

これまでファイルの先頭から「必要な」行に不快感を感じていましたので、より良い解決策があることを願っています。前回の回答で提示ソリューションをテストした後、私は簡単な解決策に来た

0

あなたはファイルウィーターテストすることができますので、私はにすべての解析を置く

if $0 == __FILE__ 

でソロ走っていますこのようなブロックの場合:

# connect.rb 
# code to be ran when required 
... 
class connect 
    .... 
end 

# the following will only be executed if this script is ran solo 
if $0 == __FILE__ 
    # code to be ran solo here 
    ... 
    # also parse options here 
    options = {} 
    optparse = OptionParser.new do |opts| 
     ... 
    end 
    optparse.parse! 
    # more code 
    ... 
end 

このソリューションは基本的にdiegoの回答のベアボーン版です。

関連する問題