class Bundler::Thor::Group

Bundler::Thor 有一个特殊的类叫做 Bundler::Thor::Group。与 Bundler::Thor 类的主要区别在于它一次性调用所有命令。它还包含一些允许在类方法中完成调用的方法,这些方法在 Bundler::Thor 命令中不可用。

公共类方法

desc(description = nil) 点击切换源代码

Bundler::Thor::Group 的描述。如果未提供,但存在源根,则尝试在其上一级文件夹中查找 USAGE,否则在超类中搜索。

参数

description<String>

Bundler::Thor::Group 的描述。

# File bundler/vendor/thor/lib/thor/group.rb, line 16
def desc(description = nil)
  if description
    @desc = description
  else
    @desc ||= from_superclass(:desc, nil)
  end
end
help(shell) 点击切换源代码

打印帮助信息。

选项

short

当为 true 时,仅显示用法。

# File bundler/vendor/thor/lib/thor/group.rb, line 29
def help(shell)
  shell.say "Usage:"
  shell.say "  #{banner}\n"
  shell.say
  class_options_help(shell)
  shell.say desc if desc
end
invoke(*names, &block) 点击切换源代码

调用给定的命名空间或类。它添加一个实例方法,该方法将调用 klass 和命令。您可以给出一个块来配置如何调用它。

给定的命名空间/类的选项将显示在帮助用法中。有关更多信息,请查看 invoke_from_option

# File bundler/vendor/thor/lib/thor/group.rb, line 56
    def invoke(*names, &block)
      options = names.last.is_a?(Hash) ? names.pop : {}
      verbose = options.fetch(:verbose, true)

      names.each do |name|
        invocations[name] = false
        invocation_blocks[name] = block if block_given?

        class_eval <<-METHOD, __FILE__, __LINE__ + 1
          def _invoke_#{name.to_s.gsub(/\W/, '_')}
            klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})

            if klass
              say_status :invoke, #{name.inspect}, #{verbose.inspect}
              block = self.class.invocation_blocks[#{name.inspect}]
              _invoke_for_class_method klass, command, &block
            else
              say_status :error, %(#{name.inspect} [not found]), :red
            end
          end
        METHOD
      end
    end
invoke_from_option(*names, &block) 点击切换源代码

基于用户为给定名为“name”的选项提供的值来调用 thor 类。必须在调用此方法之前为给定的每个名称创建一个类选项。

示例

class GemGenerator < Bundler::Thor::Group
  class_option :test_framework, :type => :string
  invoke_from_option :test_framework
end

布尔选项

在某些情况下,如果某个选项为 true 或 false,您想调用一个 thor 类。这由 invoke_from_option 自动处理。然后,选项名称用于调用生成器。

准备调用

在某些情况下,您想自定义如何调用指定的钩子。您可以通过覆盖类方法 prepare_for_invocation 来实现。类方法必须返回一个 klass 和一个可选的命令。

自定义调用

您还可以提供一个块来定制如何调用该选项。该块接收两个参数,当前类的一个实例和要调用的 klass。

# File bundler/vendor/thor/lib/thor/group.rb, line 110
    def invoke_from_option(*names, &block)
      options = names.last.is_a?(Hash) ? names.pop : {}
      verbose = options.fetch(:verbose, :white)

      names.each do |name|
        unless class_options.key?(name)
          raise ArgumentError, "You have to define the option #{name.inspect} " \
                              "before setting invoke_from_option."
        end

        invocations[name] = true
        invocation_blocks[name] = block if block_given?

        class_eval <<-METHOD, __FILE__, __LINE__ + 1
          def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
            return unless options[#{name.inspect}]

            value = options[#{name.inspect}]
            value = #{name.inspect} if TrueClass === value
            klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)

            if klass
              say_status :invoke, value, #{verbose.inspect}
              block = self.class.invocation_blocks[#{name.inspect}]
              _invoke_for_class_method klass, command, &block
            else
              say_status :error, %(\#{value} [not found]), :red
            end
          end
        METHOD
      end
    end
printable_commands(*) 点击切换源代码

返回准备好打印的命令。

# File bundler/vendor/thor/lib/thor/group.rb, line 199
def printable_commands(*)
  item = []
  item << banner
  item << (desc ? "# #{desc.gsub(/\s+/m, ' ')}" : "")
  [item]
end
也别名为: printable_tasks
printable_tasks(*)
别名为:printable_commands
remove_invocation(*names) 点击切换源代码

删除先前添加的调用。

示例

remove_invocation :test_framework
# File bundler/vendor/thor/lib/thor/group.rb, line 149
def remove_invocation(*names)
  names.each do |name|
    remove_command(name)
    remove_class_option(name)
    invocations.delete(name)
    invocation_blocks.delete(name)
  end
end

受保护的类方法

banner() 点击切换源代码

此类的横幅。如果您通过其他方式(而不是 Bundler::Thor::Runner)调用 thor 类,则可以自定义它。