我是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,我们将不胜感激。
答案 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
调用相同的代码会产生您期望的输出并尝试编写脚本。