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