我研究类结构以实现 cli 脚本。
我想创建类方法来注册命令。当注册一个命令时,我想为此自动生成一个 getter。
所以,我有这个结构:
lib/my_lib/commands.rb
lib/my_lib/commands/setup_command.rb
然后文件内容:
# lib/my_lib/commands.rb
method MyLib
  method Commands
    def self.included(base)
      base.extend(ClassMethods)
    end
    module ClassMethods
      def register_command(*opts)
        command = opts.size == 0 ? {} : opts.extract_options!
        ...
      end
      def register_options(*opts)
        options = opts.size == 0 ? {} : opts.extract_options!
        ...
      end
    end
    class AbstractCommand
      def name
        ...
      end
      def description
        ...
      end
      def run
        raise Exception, "Command '#{self.clas.name}' invalid"
      end
    end
  end
end
# lib/my_lib/commands/setup_command.rb
module MyLib
  module Commands
    class SetupCommand < AbstractCommand
      include MyLib::Commands
      register_command :name        => "setup",
                       :description => "setup the application"
      def run
        puts "Yeah, my command is running"
      end
    end
  end
end
我想要的:
# my_cli_script
#!/usr/bin/env ruby
require 'my_lib/commands/setup_command'
command = MyLib::Commands::SetupCommand.new
puts command.name # => "setup"
puts command.description # => "setup the application"
puts command.run # => "Yeah, my command is running"