【问题标题】:Variable in Thor descThor desc 中的变量
【发布时间】:2015-11-24 15:27:06
【问题描述】:

对于一个 cli 项目,我希望有一个带有 thor 任务的共享超类。调用子命令帮助时,它应该使用自定义描述公开共享命令。

我想出了下面的代码,但变量@plural 没有在描述中替换。

这可以通过 Thor 和一些元编程实现吗?

module MyModule
  class ResourceSubcommand < Thor

    def initialize(*args)
      super
    end

    desc "list", "list all #{@plural}"
    def list
      list_object(@default_list_columns)
    end
  end
end

module MyModule
  class Account < MyModule::ResourceSubcommand

    def initialize(*args)
      super
      @plural = 'accounts'
    end

  end
end

module MyModule
  class Commands < Thor

    desc "account SUBCOMMAND ...ARGS", "manage Exact Online accounts"
    subcommand "account", Account

  end
end

运行$ thorcli account help 应该输出:

Commands:
  thorcli account help [COMMAND]     # Describe subcommands or one specific subcommand
  thorcli account list               # list all accounts

【问题讨论】:

    标签: ruby command-line-interface thor


    【解决方案1】:

    传递给desc的字符串是在的上下文中求值的,但是initialize方法是在instances的上下文中求值的,所以两者@plural 属于两个不同的对象。

    此外,desc 在定义超类MyModule::ResourceSubcommand 时立即被调用,并且在继承超类并设置子类中的@plural 后,没有简单的方法推迟其评估,您的目标似乎很很难实现。

    附:我尝试过覆盖MyModule::ResourceSubcommand::inheritedMyModule::ResourceSubcommand.singleton_class::inherited,但失败了。也许您可以将MyModule::ResourceSubcommand 定义为一个模块,覆盖其self.included,并将其设置@plural 后包含在子类中。

    更新

    我终于成功了。这是我的解决方案:

    module MyModule
    
      # Change from class to module
      module ResourceSubcommand
    
        # A hook called when this module is included by other modules
        def self.included(base)
          base.class_eval do
            desc "list", "list all #{@plural}"
            def list
              list_object(@default_list_columns)
            end
          end
        end
      end
    end
    
    module MyModule
    
      # No inheritance
      class Account
    
        # Don't put this in any instance methods, including #initialize
        @plural = 'accounts'
    
        # Be sure to include after @plural is set
        include ResourceSubcommand
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多