ARGV 处理器:如何定义由任何明确前缀调用的命令 "foo"

ARGV processers: how to define command "foo" which is invoked by any unambiguous prefix

我想用命令 "foo"、"bar" 和 "find" 定义命令行应用程序 "cla",这样:

./cla foo./cla fo 都调用为 foo

定义的方法

./cla find./cla fi 都调用 find

./cla bar./cla b 都调用为 bar

定义的方法

./cla f 抛出错误

或相当相似的东西。希望这很清楚。

在 Thor 或 Commander 中是否可以做到这一点并不明显。我没看过斯洛普。是否有任何 ARGV 处理器库具有此功能?有人可以告诉我哪些库,并指出该功能的文档吗?

编辑:需要说明的是,我并不是在寻求解决上述具体问题的帮助。我在问是否有可能(并且不太困难)使用标准命令行应用程序构建器库之一来完成它,除了能够通过名称前缀调用命令之外,它还提供了我想要的许多有用功能。

当一切都需要三行代码时,我看不出有任何理由去寻找库:

meths = %w(foo find bar) # or take from self.methods(false)

variants = meths.select { |m| m =~ /\A#{ARGV[1]}/ }
case variants.size
when 0 then raise 'Unknown method.'
when 1 then public_send variants.first # succeeded, call it
else raise "Umbiguity. Variants: #{variants}."
end

实际上,thor 似乎开箱即用地自动执行您想要的操作。具体来说,如果缩写形式明确匹配,它会执行适当的命令。

给出这个简单的例子:

#!/usr/bin/env ruby

require "thor"

class CLA < Thor
  desc "foo", 'Says "foo"'
  def foo
    puts "foo"
  end

  desc "find", 'Says "find"'
  def find
    puts "find"
  end

  desc "bar", 'Says "bar"'
  def bar
    puts "bar"
  end
end

CLA.start

然后:

$ ./cla fo
foo
$ ./cla f
Ambiguous command f matches [find, foo]
$ ./cla fi
find
$ ./cla b
bar

如果您真的希望 "f" 始终映射到 "foo" 并且不给出不明确的命令错误,请像这样使用 map

desc "foo", 'Says "foo"'
def foo
  puts "foo"
end
map "f" => :foo

现在可以使用了:

$ ./cla f
foo