Как передать переключатель перед командой в приложении Thor? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть приложение 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 голосов
/ 21 февраля 2019

Краткий взгляд на документацию и примеры вместе со стандартными соглашениями 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

И ваш скрипт ruby, который вы можете сделать exec, псевдоним и т. Д .:

#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"}
...