模块 Bundler::Thor::Invocation
公共实例方法
current_command_chain() 点击切换源代码
使当前命令链在 Bundler::Thor-(子)命令中可访问
# File bundler/vendor/thor/lib/thor/invocation.rb, line 30 def current_command_chain @_invocations.values.flatten.map(&:to_sym) end
invoke(name = nil, *args) 点击切换源代码
接收一个名称并调用它。名称可以是字符串(“command”或“namespace:command”),一个 Bundler::Thor::Command
,一个类或一个 Bundler::Thor 实例。如果无法通过名称猜测命令,也可以作为第二个参数提供。
您还可以为要调用的命令提供参数、选项和配置值,如果没有给出,则使用用于初始化调用者的相同值来初始化被调用的命令。
当没有给出名称时,它将调用当前类的默认命令。
示例¶ ↑
class A < Bundler::Thor def foo invoke :bar invoke "b:hello", ["Erik"] end def bar invoke "b:hello", ["Erik"] end end class B < Bundler::Thor def hello(name) puts "hello #{name}" end end
您会注意到上面的方法 “foo” 调用了两个命令:“bar”,它属于同一个类,以及 “hello”,它属于 B 类。
通过使用调用系统,您可以确保一个命令只被调用一次。在上面的示例中,调用 “foo” 将只调用一次 “b:hello”,即使稍后由 “bar” 方法调用也是如此。
当 A 类调用 B 类时,A 初始化时使用的所有参数都会提供给 B。这允许延迟解析选项。假设您有一些 rspec 命令
class Rspec < Bundler::Thor::Group class_option :mock_framework, :type => :string, :default => :rr def invoke_mock_framework invoke "rspec:#{options[:mock_framework]}" end end
如您所见,它调用了给定的模拟框架,该框架可能有自己的选项
class Rspec::RR < Bundler::Thor::Group class_option :style, :type => :string, :default => :mock end
由于解析模拟框架选项不是 rspec 的关注点,当调用 RR 时,所有选项都会再次解析,以便 RR 可以仅提取它将要使用的选项。
如果您希望使用自己的一组选项来初始化 Rspec::RR,则必须显式地执行此操作
invoke "rspec:rr", [], :style => :foo
除了给出一个实例外,您还可以给出一个要调用的类
invoke Rspec::RR, [], :style => :foo
# File bundler/vendor/thor/lib/thor/invocation.rb, line 102 def invoke(name = nil, *args) if name.nil? warn "[Bundler::Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}" return invoke_all end args.unshift(nil) if args.first.is_a?(Array) || args.first.nil? command, args, opts, config = args klass, command = _retrieve_class_and_command(name, command) raise "Missing Bundler::Thor class for invoke #{name}" unless klass raise "Expected Bundler::Thor class, got #{klass}" unless klass <= Bundler::Thor::Base args, opts, config = _parse_initialization_options(args, opts, config) klass.send(:dispatch, command, args, opts, config) do |instance| instance.parent_options = options end end
invoke_with_padding(*args) 点击切换源代码
使用 shell 填充进行调用。
# File bundler/vendor/thor/lib/thor/invocation.rb, line 138 def invoke_with_padding(*args) with_padding { invoke(*args) } end