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 그러면 일부 옵션과 다른 옵션을 덮어 쓰게됩니다. config 파일의 옵션 값. + 만약 내가 그 opts.on 블록에서 유효성 검사가 적용되지 않습니다, 옵션 검사가 적용됩니다 (그래서 내가 구성 할 수있는 일부 미친 값을 쓸 수 있습니다). 이 접근법은 틀 렸습니다. 나는 이미 그것을 시도했다. – Daniel

+1

@ 대니얼, 나는 일반적인 생각을 제공하려고 노력했다. 물론 당신의 필요에 맞게 수정해야한다. – tokland

2

루비에 익숙해졌지만 options.merge를 조정해야했습니다 (options.merge를 사용하려면!) :

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

나를 위해이 기능을 사용하려면이 방법이 좋습니다.