我有一个Thor应用程序,所有命令都需要许多相同的参数。通用参数用class_option
声明。但是我希望用户将它们放在命令之前。
例如,我的用户可能需要输入以下顺序...
mycli cmd1 arg1 arg2 --switch1 --switch2=value
mycli cmd2 arg3 arg4 --switch1 --switch2=value
mycli cmd3 arg5 arg6 --switch1 --switch2=value
每次我的用户需要重新输入或大量退格键来编辑命令行。这样做会更容易...
mycli --switch1 --switch2=value cmd1 arg1 arg2
mycli --switch1 --switch2=value cmd2 arg3 arg4
mycli --switch1 --switch2=value cmd3 arg5 arg6
通过这种方式,每次调用都需要更改的部分在命令行的末尾,而可能保持不变的参数在开始处。命令行编辑变得非常简单。
雷神(Thor)有什么方法可以支持这一点吗?
答案 0 :(得分:0)
简要浏览文档和示例以及标准的ruby约定将表明应该最后通过选项。但这是使用ruby脚本对命令行进行“排序”的方法,这是一个基本示例:
#test.thor
class Test < Thor
method_option :demo, :aliases => "-d", :desc => "demo"
method_option :foo, :aliases => "-f", :desc => "foo"
method_option :bar, :aliases => "-b", :desc => "bar"
desc "example", "an example task"
def example
puts "option switches passed: #{options.to_s}"
end
end
还有您可以创建exec,别名等的ruby脚本:
#hack.rb
#!/usr/bin/env ruby
args = ARGV
cmd = args.reject{|a| a[0] == '-'}.first
switches = args.select{|a| a[0] == '-'}
cmd_args = args[1..-1] - switches
system_cmd = ['thor', cmd, args, switches].join(' ')
system(system_cmd)
出于测试目的,您可以这样调用它:
thor test:example -f -d -b
#=>option switches passed: {"foo"=>"foo", "demo"=>"demo", "bar"=>"bar"}
ruby hack.rb -f -b -d test:example
#=> option switches passed: {"foo"=>"foo", "bar"=>"bar", "demo"=>"demo"}