ruby - 如何在单独的类/模块/文件中编写 Thor 任务?

标签 ruby module thor

我在获取 Thor 时遇到了一些问题这样做,所以希望有人能指出我做错了什么。

我有一个主类 class MyApp < Thor我想为多个命名空间分成单独的文件,比如 thor create:app_typethor update:app_type .我找不到任何示例来说明应该如何将 Thor 应用程序分解成多个部分,而且我尝试过的方法似乎不起作用。

举个例子,这个类我正试图从主 Thor 类中脱离出来:

module Things
  module Grouping

    desc "something", "Do something cool in this group"
    def something
      ....
    end
  end
end

当我尝试在我的主类中包含或要求它时:

class App < Thor
  ....
  require 'grouping_file'
  include Things::Grouping
  ....
end

我得到一个异常:'<module:Grouping>': undefined method 'desc' for Things::Grouping:Module (NoMethodError)

是否可以为 Thor 任务设置多个命名空间?如果可以,如何将其分解,这样您就不会拥有一个需要数百行代码的整体类?

最佳答案

为什么它不起作用:当您在 Thor 类中使用 desc 时,您实际上是在调用类方法 Thor.desc .当您在模块中执行此操作时,它会调用显然不存在的 YourModule.desc

我可以建议两种方法来解决这个问题。

修复一:使用 Module.included

您是否希望在多个 Thor 类中重复使用这些任务?

当模块在 Ruby 中用作 include 时,会调用 include 类方法。 http://www.ruby-doc.org/core/classes/Module.html#M000458

module MyModule
  def self.included(thor)
    thor.class_eval do

      desc "Something", "Something cool"
      def something
        # ...
      end

    end
  end
end

修复二:将 Thor 类分成多个文件

您是否只想在另一个文件中单独定义任务?

如果是这样,只需在另一个文件中重新打开您的 App 类。您的 Thorfile 看起来像:

# Thorfile
Dir['./lib/thor/**/*.rb'].sort.each { |f| load f }

那么你的 lib/thor/app.rb 将包含一些 App 的任务,而另一个文件 lib/thor/app-grouping.rb 将包含同一个 App 类的更多任务。

关于ruby - 如何在单独的类/模块/文件中编写 Thor 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729071/

相关文章:

Python 模块、Pip、Cronjobs

ruby-on-rails - JSON::ParserError: 757: '{ 处的意外标记

ruby-on-rails - 在 RubyMine 上调试 Ruby 代码时的随机断点

ruby-on-rails - Rails ActiveRecord - update_all : how to update multiple fields at once with mixed type of arguments

perl - 尝试在 Win32 上通过 PPM/Activestate 5.12 安装 Moose-2.000 - 找不到 404

ruby-on-rails - 使用 Thor 删除文件中的一行

ruby-on-rails - 检查记录是否刚刚在 rails 中被破坏

javascript - node.js 中模块化 socket.io 的架构

ruby-on-rails - `rails generate scaffold_controller` 不响应 View 参数

ruby - 如何将 Thor::Group 注册为带参数的子命令