如果使用OptionParser未定义路径,如何调用帮助?

时间:2014-01-13 17:20:20

标签: ruby

我是Ruby的新手,我正在尝试编写一个优雅的方法来设置程序的工作目录。所有文件访问都相对于此路径。

该程序可能会也可能不会在Git仓库中运行。我还想提供一种覆盖路径的方法。

我正在使用OptionParser并且很难让它正确设置选项。无论我是否使用work_area标志,似乎--work_area始终设置为Git toplevel。我已经尝试在||中使用opts.on运算符,但这也不起作用。

options = {}
OptionParser.new do |opts|
  opts.banner =  "Usage: mysprogram.rb [options]"

  options[:work_area] = `git rev-parse --show-toplevel --quiet 2>/dev/null`
  opts.on("-d", "--work_area", String, "Override default work area.") do |wa|
    options[:work_area] = wa
  end
  if options[:work_area]
    puts "Work area is " + options[:work_area]
  else
    puts "ERROR: Valid work directory not found or specified."
    puts opts
    exit
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end
end.parse!

对于我做错了什么,或者如何让它更像Ruby,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

传递给opts.on("-d" ...)的块在传递给OptionParser.new的块后被称为,因此在参数解析之前正在执行puts语句实际上发生了。尝试将其初始化为OptionParser.new块之外的默认值(并进行测试):

options = {}
opts = OptionParser.new do |opts|
  opts.banner =  "Usage: mysprogram.rb [options]"

  opts.on("-d", "--work_area", String, "Override default work area.") do |wa|
    options[:work_area] = wa
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end
end
opts.parse!

# Notice the "||=" here; this means "set options[:work_area] to a new thing 
# only if it's not nil or false."
options[:work_area] ||= `git rev-parse --show-toplevel --quiet 2>/dev/null`

if options[:work_area]
  puts "Work area is " + options[:work_area]
else
  puts "ERROR: Valid work directory not found or specified."
  puts opts
  exit
end

答案 1 :(得分:1)

我总是使用类似的东西:

require 'optparse'

options = {}
OptionParser.new do |opt|
  opt.banner = "Usage: #{ File.basename($0) } [options]"
  opt.on('--path PATH') { |o| options[:path] = o }
  options[:help] = opt.help
end.parse!

puts options[:help] if !options[:path]

保存并使用--path foo选项运行它不会返回任何输出。

在没有--path foo选项输出的情况下运行它:

Usage: test.rb [options]
        --path PATH

另请注意,如果您没有定义,OptionParser会自动为您提供-h--help参数。使用-h调用相同的代码会产生您期望的输出并尝试编写脚本。