模块 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