如何在Thor应用程序中的命令前传递开关?

时间:2019-02-21 00:38:06

标签: ruby thor

我有一个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)有什么方法可以支持这一点吗?

1 个答案:

答案 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"}