Ruby选项解析器。此代码是否可能更简洁?

Ruby选项解析器。此代码是否可能更简洁?,ruby,Ruby,我已经编写了一个工作脚本,它有几个命令行选项。我想做一些必要的选择。我的研究得到了以下代码。您将看到在脚本的末尾,我将分别检查是否提供了选项 在python中,argparse模块有一个参数“required=True”,如果提供了给定参数,该参数将自动退出程序。我在ruby模块中找不到类似的东西。是否有其他更高级的参数解析模块?有没有更简洁的方法来编写这段代码 options = {} optparse = OptionParser.new do |opts| opts.banner =

我已经编写了一个工作脚本,它有几个命令行选项。我想做一些必要的选择。我的研究得到了以下代码。您将看到在脚本的末尾,我将分别检查是否提供了选项

在python中,argparse模块有一个参数“required=True”,如果提供了给定参数,该参数将自动退出程序。我在ruby模块中找不到类似的东西。是否有其他更高级的参数解析模块?有没有更简洁的方法来编写这段代码

options = {}

optparse = OptionParser.new do |opts|
  opts.banner = "\nUsage: How to use the code"
  opts.on('--debug',
      "Change log level to debug. Default is INFO") do |l|
    options[:debug] = l
  end

  options[:logfile] = "stage_refresh.out"
  opts.on('-l', '--logfile LOGFILE', "Logfile to log results. Default is stage_refresh.out") do |l|
    options[:source] = l
  end

  options[:source] = "localhost"
  opts.on('-s', '--source SOURCE_HOST', "Source host for dump. Default is localhost") do |s|
    options[:source] = s
  end

  opts.on('-t', '--target TARGET', "Target host to refresh. Must specify.") do |t|
    options[:target] = t
  end
end

optparse.parse!

unless options[:source_pass]
  puts "Must have --source_pass PASSWORD"
end

unless options[:target]
  puts "Must have --target TARGET_SERVER"
end

if options[:debug]
  logger.level = Logger::DEBUG
else
  logger.level = Logger::INFO
end

puts options[:source_pass]
puts options[:target]

您可能会感兴趣。它有长/短选项、默认值、必需标志等。它的使用与您现在拥有的没有什么不同。

OptionParser不是很优雅

ruby stdlib中也有GetOptLang,但也不是很好

slop和trollop存在,thor

ruby本身无法就这个问题的非常优雅的解决方案达成一致,这有点令人恼火

实际上,我自己最终直接解析了ARGV(尽管传入了一个方法,该方法将为我处理命令行解析)

大多数时候,我不需要像这样的东西:

--设置基本目录/tmp


所以没关系。但是更高级的命令行脚本需要它,所以我通常使用OptionParser,但在它里面,我调用主应用程序中处理这些东西的方法。我只为我得到的--set\foo额外的东西使用OptionParser。

您可以使用它以简单易用的方式编写CLI工具。

我同意OptionParser有点冗长。我推荐你。在所有选项中(按受欢迎程度排序),它似乎最接近您所寻找的界面。它是专门为比OptionParser更简洁而编写的

用法示例(自述文件中):


另请看可能的副本,这是我一直在寻找的。谢谢
opts = Slop.parse do
  banner 'Usage: foo.rb [options]'

  on 'name=', 'Your name'
  on 'p', 'password', 'An optional password', argument: :optional
  on 'v', 'verbose', 'Enable verbose mode'
end

# if ARGV is `--name Lee -v`
opts.verbose?  #=> true
opts.password? #=> false
opts[:name]    #=> 'lee'
opts.to_hash   #=> {:name=>"Lee", :password=>nil, :verbose=>true}