Ruby OptionParser空开关“ – ”行为

编辑:

我编写了使用OptionParser优雅地处理命令行输入的代码。 我正面临两大打击。

  1. 传递空开关’ – ‘不会出错。 当然有些程序认为有效,但我的不应该。
  2. 该程序需要两个强制开关,但它接受一个开关没有抱怨! 例如program.ruby -f foo -b bar是有效输入,两个开关都是:REQUIRED。 但只提供一个开关没有问题,这不是理想的行为。

对于第一种情况,我已经这样做了:

 opts.on('-', /\A-\Z/) do $stderr.print "Invalid empty switch" exit 1 end 

它工作正常。 但这是正确的做法吗?

对于第二种情况,我在OptionParser.new块中寻找解决方案,但我找不到一个。 例如

 unless options.foo && options.bar puts "Error." exit 2 end 

在OptionParser.new块之外进行是正常的方法吗?

如果您使用OptionParser,则是,您需要明确禁止空开关并手动检查所需参数。

但是,如果您使用其他工具进行选项解析(例如defunkt的gem选择) ,则可以根据需要标记选项,并且无效选项(例如空开关)将导致打印帮助并退出应用程序。 我知道在某些情况下使用OptionParser更有意义,但我个人更喜欢使用更方便的工具 。

尽管通过这种方式或其他方式制作所需的选项非常简单,但我建议您考虑通过API做出决定。 您知道有多少命令行实用程序,它们有必需的选项? 命令行通常分为选项和参数,前者通常是可选的,后者通常是必需的。 我会坚持既定的惯例。

我认为Thor(https://github.com/wycats/thor)可以更有效地解决您的问题。