2010-12-07 2 views
2

私はOptionParserを利用したスクリプトを持っており、option = valueフォーマットと# commentsを持つプログラムの設定ファイルを追加したいと思います。 OptionParserの解析ファイルを作成する方法や、OptionParserのルールとスイッチを使用して設定ファイルを使用できるクラスがありますか?Ruby:OptionParserと組み合わされた設定ファイルパーサー

ありがとうございます。

答えて

2

AFAIKあなたが聞いたことのための組み込みのサポートはありませんが、それを達成するためには非常に多くの方法があるため、理解できます。コンフィグYAMLの

default_options = { 
    :name => nil, 
    :verbose => false, 
} 

options = default_options 
OptionParser.new do |opts| 
    opts.banner = "Usage: example.rb [options]" 
    opts.on("-v", "--verbose", "Run verbosely") do 
    options[:verbose] = true 
    end 
    opts.on("-n", "--name NAME", "Set name") do |name| 
    options[:name] = name 
    end 
    opts.on("-f", "--configfile PATH", String, "Set config file") do |path| 
    options.merge!(Hash[YAML::load(open(path)).map { |k, v| [k.to_sym, v] }]) 
    end 
end.parse! 
p options 

例:私ははdefault_optionsハッシュ+ YAMLの設定ファイルを使用したい

# config.yml 
verbose: true 
name: name_fromconf 

をそして、これは(オーバーライドを持つ例)の結果である:まだ

$ ruby example.rb -f config.yml -n "hello" 
{:name=>"hello", :verbose=>true} 
+0

の場合、それはうまくいきません: – Daniel

+0

xyz.rb --some-option = X --another-one = Y --configfile =/some/file.ymlこれはsome-optionとanotherを上書きしますconfigファイルからのオプション値。 +私はそれらのopts.onブロックで検証がある場合、それは適用されません、オプションのチェックも適用されません(私は設定にいくつかの狂った値を書くことができます)。このアプローチは間違っています。私はすでにそれを試してみました。 – Daniel

+1

@ダニエル、私は一般的な考えを提供しようとしましたが、あなたの特定のニーズに合わせて修正する必要があります。 – tokland

2

Rubyに慣れ親しんだのですが、options.mergeを調整する必要がありました(options.mergeを使用するには!):

options.merge!(Hash[YAML::load(open(path)).map { |k, v| [k.to_sym, v] }]) 

これは私のために働くためには、これは素晴らしいものですが、間違いなく答えに感謝します。

関連する問題