使用Thor,可以使用method_option设置特定任务的选项.要为类中的所有任务设置选项,可以使用class_option.但是,如果一个人想要一个班级的某些任务,而不是全部,分享选项呢?
在以下task1和task2共享选项中,但它们不共享所有选项,并且它们不共享选项task3.
require 'thor'
class Cli < Thor
desc 'task1', 'Task 1'
method_option :type, :type => :string, :required => true, :default => 'foo'
def task1
end
desc 'task2', 'Task 2'
method_option :type, :type => :string, :required => true, :default => 'foo'
method_option :value, :type => :numeric
def task2
end
desc 'task3', 'Task 3'
method_option :verbose, :type => :boolean, :aliases => '-v'
def task3
end
end
Cli.start(ARGV)
Run Code Online (Sandbox Code Playgroud)
与说明的问题method_option :type, :type => :string, :required => true, :default => 'foo'两种task1,并task2是它违反了DRY原则.是否有一种惯用的处理方式?
N.N*_*.N. 14
method_option在thor.rb中定义,它根据文档采用以下参数:
name<Symbol>:: 参数的名称.options<Hash>:: 如下面所描述的.知道了这一点,你可以将参数存储method_option在一个数组,展开阵列为单独的参数作为method_option被调用.
require 'thor'
class Cli < Thor
shared_options = [:type, {:type => :string, :required => true, :default => 'foo'}]
desc 'task1', 'Task 1'
method_option *shared_options
def task1
end
desc 'task2', 'Task 2'
method_option *shared_options
method_option :value, :type => :numeric
def task2
end
desc 'task3', 'Task 3'
method_option :verbose, :type => :boolean, :aliases => '-v'
def task3
end
end
Cli.start(ARGV)
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是惯用的,我不认为它是那么优雅.不过,这比违反DRY原则更好.